<p>一个更实用的<code>itertools.groupby</code>方法可能是这样的。有点神秘,我来解释。你知道吗</p>
<pre><code>from itertools import groupby
from operator import itemgetter
inp = [
{'name': 'Craig McKray', 'document_id': 50, 'annotation_id': 8},
{'name': 'None on file', 'document_id': 40, 'annotation_id': 5},
{'name': 'Craig McKray', 'document_id': 50, 'annotation_id': 9},
{'name': 'Western Union', 'document_id': 61, 'annotation_id': 11}
]
def groupvals(vals):
namegetter = itemgetter('name')
doccanngetter = itemgetter('document_id', 'annotation_id')
for grouper, grps in groupby(sorted(vals, key=namegetter), key=namegetter):
docanns = [set(param) for param in zip(*(doccanngetter(g) for g in grps))]
yield {'name': grouper, 'document_id': list(docanns[0]), 'annotation_id': list(docanns[1])}
for result in groupvals(inp):
print(result)
</code></pre>
<p>要使用<code>groupby</code>,您需要一个排序的列表。所以先按名字排序。然后是<code>groupby</code>名称。接下来您可以拉出<code>document_id</code>和<code>annotation_id</code>参数并压缩它们。这样做的效果是将所有<code>document_ids</code>放在一个列表中,将所有<code>annotation_id</code>放在另一个列表中。然后可以调用<code>set</code>删除重复项,并使用生成器将每个元素生成为<code>dict</code>。你知道吗</p>
<p>我使用了一个生成器,因为它避免了建立结果列表的需要。如果你愿意的话你也可以这么做。你知道吗</p>