<p>听起来这就是你想做的:</p>
<pre><code>list1 = [{'name': 'bob', 'email': 'bob@bob.com',
'address': '123 house lane', 'student_id': 12345},
{'name': 'steve', 'email': 'steve@steve.com',
'address': '456 house lane', 'student_id': 34567},
{'name': 'bob', 'email': 'bob2@bob2.com',
'address': '789 house lane', 'student_id': 45678}]
import operator
list1.sort(key=operator.itemgetter('name'))
new_list = []
for studentname, dicts in itertools.groupby(list1, operator.itemgetter('name')):
d = {'name': studentname}
for dct in dicts:
for key,value in dct.items():
if key == 'name':
continue
d.setdefault(key, []).append(value)
new_list.append(d)
</code></pre>
<p>演示:</p>
^{pr2}$
<p>如果您打算广泛地使用它,您可能应该硬编码一些更好的名称(例如,<code>addresses</code>而不是<code>address</code>),并创建一个映射来填充它们。在</p>
<pre><code>keys_mapping = {'address': 'addresses',
'email': 'emails',
'student_id': 'student_ids'}
for studentname, dicts in itertools.groupby(list1, operator.itemgetter('name')):
d = {'name': studentname}
for dct in dicts:
for key,value in dct_items():
new_key = keys_mapping.get(key,key)
# get the updated value if it's defined, else give `key`
d.setdefault(new_key, []).append(value)
new_list.append(d)
</code></pre>