<p>在你的键上使用另一个<em>字典和组,我的意思是“name”和“id”(尽管,<code>"id"</code>是不够的吗?如果不够的话会误导人)</p>
<p>比如:</p>
<pre><code>grouper = {}
for q in quantities:
key = q['name'], q['id']
if key in grouper:
grouper[key]['quantity'] += q['quantity']
else:
grouper[key] = q.copy()
quantities = list(grouper.values())
</code></pre>
<p>在答复中:</p>
<pre><code>In [1]: quantities = [
...: {
...: "name":"first",
...: "id":"1234",
...: "quantity":10
...: },
...: {
...: "name":"first",
...: "id":"1234",
...: "quantity":30
...: },
...: {
...: "name":"another",
...: "id":"0000",
...: "quantity":10
...: }
...: ]
In [2]: grouper = {}
In [3]: for q in quantities:
...: key = q['name'], q['id']
...: if key in grouper:
...: grouper[key]['quantity'] += q['quantity']
...: else:
...: grouper[key] = q.copy()
...:
In [4]: grouper
Out[4]:
{('first', '1234'): {'name': 'first', 'id': '1234', 'quantity': 40},
('another', '0000'): {'name': 'another', 'id': '0000', 'quantity': 10}}
</code></pre>
<p>然后,您可以直接从值中获取新列表:</p>
<pre><code>In [5]: list(grouper.values())
Out[5]:
[{'name': 'first', 'id': '1234', 'quantity': 40},
{'name': 'another', 'id': '0000', 'quantity': 10}]
</code></pre>
<p>这种方法需要线性时间和线性空间</p>
<p>注意,<code>q.copy()</code>创建了一个<em>浅</em>副本,这在这里很好,但如果您的dict中有可变值,则可能不是</p>
<p>另外请注意,您可能需要重新考虑您的数据结构。你真的想要一份清单吗?如果您有一个唯一的键,并且希望能够通过该键快速找到对象,则可能需要某种类型的dict</p>