<p><strong>方法1:使用groupby和reduce</strong></p>
<pre><code>from itertools import groupby
from functools import reduce
def merge(d1, d2):
' merge two dictionaries based upon summing key values not in grouper '
return {k:v if k in grouper else v + d2.get(k, 0) for k, v in d1.items()}
grouper = ("name", "id") # keys to groupby
lst.sort(key = lambda d:[d[key] for key in grouper]) # Sort list inplace based upon grouper keys
# Done inplace to save space
# Merge dicts in list in same group based upon merge function
outputlist = [(reduce(merge, g)) for _, g in groupby(lst, lambda d:[d[key] for key in grouper])]
</code></pre>
<hr/>
<pre><code>[{'name': 'another', 'id': '0000', 'quantity': 10},
{'name': 'first', 'id': '1234', 'quantity': 40}]
</code></pre>
<p><strong>使用熊猫的方法2</strong></p>
<p>避免所有循环的一行程序(方法基本上复制了方法1)</p>
<pre><code>outputlist = pd.DataFrame(lst).groupby(['name', 'id']).sum().reset_index().to_dict('records')
</code></pre>
<hr/>
<p>输出列表:</p>
<pre><code>[{'name': 'another', 'id': '0000', 'quantity': 10},
{'name': 'first', 'id': '1234', 'quantity': 40}]
</code></pre>
<p><em>解释</em></p>
<pre><code>pd.DataFrame(lst) - generate pandas DataFrame from list of dictionaries
groupby(['name', 'id']) - group rows by name & id
sum() - sum the non-grouped values in each group
reset_index() - reset index back to 0, 1, 2, ...
to_dict('records') - convert to list of dictionaries
with each row data as dictionary
</code></pre>