<p>Python中的二维列表仅仅是列表的列表。因此,<code>data_list</code>的每个元素本身就是一个列表。下面是访问元素的示例,即标题行下面的第一个元素(因此,索引1):</p>
<pre><code>>>> first_entry = data_list[1]
>>> first_entry
['Rudolph S', 1500, 3, 0]
</code></pre>
<p>由于<code>data_list[1]</code>(我们将其存储为一个名为<code>first_entry</code>的变量)也是我们可以访问的列表,因此我们可以访问第一个条目的第四个元素(在索引3处,因为列表从0开始索引),如下所示:</p>
<pre><code>>>> first_entry = data_list[1]
>>> fourth_element = first_entry[3]
>>> fourth_element
0
</code></pre>
<p>或者,更简洁地说:</p>
<pre><code>>>> data_list[1][3]
0
</code></pre>
<p>所以,要开始回答你的问题,如果你的目标是更新<code>"Joye A"</code>的捐赠金额,你应该使用<code>data_list[3][1] = donation_amt</code>。这是因为Joye的条目位于主列表的索引3处,捐款记录在其子列表的索引1处。你知道吗</p>
<p>不幸的是,这并不能真正解决您的问题,因为您希望使用任意名称来创建新条目或更新现有条目。这里真正的答案是您使用了错误的数据结构。不过,出于教育价值的考虑,我将继续介绍如何利用现有结构实现这一点。你知道吗</p>
<h2>使用矩阵</h2>
<p>首先,您需要确定名称是否已经存在。因此,最好创建一个只包含<em>第一列</em>的额外列表,即1-d列表。你可以用很多方法来做。我将以列表形式显示:</p>
<pre><code>>>> names_only = [e[0] for e in data_list]
>>> names_only
['NAMES', 'Rudolph S', 'Josef M', ...]
</code></pre>
<p>我不会在这里解释这一点,但是有很多线索解释列表理解是如何为那些不知道的读者工作的。你知道吗</p>
<p>首先,检查该名称是否已存在于矩阵中:</p>
<pre><code>>>> 'Josef M' in names_only
True
</code></pre>
<p>如果是这样,您现在需要找到您要查找的名称的索引。Python中的列表有一个索引函数:</p>
<pre><code>>>> idx = names_only.index('Joesf M')
>>> idx
2
</code></pre>
<p>您现在更新他的捐赠金额,如上所述:</p>
<pre><code>>>> data_list[idx][1] = donation_amt
</code></pre>
<p>现在,如果他不在矩阵中,我们就要重新开始。假设我们正在处理一个名为<code>'bob'</code>的用户。他还没有进入母体。这里使用append函数:</p>
<pre><code>>>> data_list.append([bob, donation_amt, 1, None])
</code></pre>
<p>其中<code>1</code>和<code>None</code>可以替换为任何默认值。将其作为一个函数:</p>
<pre><code>>>> def update_or_create(name, amt):
... names = [e[0] for e in data_list]
... if name in names:
... idx = names.index(name)
... data_list[idx][1] = amt
... else:
... data_list.append([name, amt, 1, None])
</code></pre>
<p>你要做什么就做什么。你知道吗</p>
<h2>最后</h2>
<p>最好使用不同的结构。我会提出一个dict结构,比如:</p>
<pre><code>new_structure = {NAME: {'donation': DONATION_AMT, 'num_gifts': NUM_GIFTS, 'avg_amt': AVERAGE_DONATION},...}
</code></pre>
<p>无需太多细节,遵循此格式将允许以下函数执行相同的任务:</p>
<pre><code>>>> def update_or_create(name, amt):
... if name in new_structure:
... new_structure[name]['donation'] = amt
... else:
... new_structure.update({name: {'donation': amt, 'num_gifts': 1, 'avg_amt': None}})
</code></pre>
<p>好多了。你知道吗</p>