我有一个这样的字典列表。
students = [
{'name': 'alex','class': 'A'},
{'name': 'richard','class': 'A'},
{'name': 'john','class': 'C'},
{'name': 'harry','class': 'B'},
{'name': 'rudolf','class': 'B'},
{'name': 'charlie','class': 'E'},
{'name': 'budi','class': 'C'},
{'name': 'gabriel','class': 'B'},
{'name': 'dessy', 'class': 'B'}
]
我想把这些字典按类进行分组 把它们附加到一个列表中 然后把每个列表附加到一个列表中。
[[{'name': 'alex', 'class': 'A'},
{'name': 'richard', 'class': 'A'}],
[{'name': 'harry', 'class': 'B'},
{'name': 'rudolf', 'class': 'B'},
{'name': 'gabriel', 'class': 'B'},
{'name': 'dessy', 'class': 'B'}],
[{'name': 'john', 'class': 'C'},
{'name': 'budi', 'class': 'C'}],
[{'name': 'charlie', 'class': 'E'}]]
我知道如何对前一个列表进行排序,使用 itemgetter。
import itertools
from operator import itemgetter
students = sorted(students, key=itemgetter('class'))
我如何将它们分组附加到一个列表中,并创建一个列表的列表?另外,在这种情况下,使用集合会不会更好(顺序并不重要,只要字典按类分组即可)。
groupby
拯救。
In [37]: from itertools import groupby
In [38]: from operator import itemgetter
In [39]: students.sort(key=itemgetter('class'))
In [40]: [list(v) for _, v in groupby(students, itemgetter('class'))]
Out[40]:
[[{'name': 'alex', 'class': 'A'}, {'name': 'richard', 'class': 'A'}],
[{'name': 'harry', 'class': 'B'},
{'name': 'rudolf', 'class': 'B'},
{'name': 'gabriel', 'class': 'B'},
{'name': 'dessy', 'class': 'B'}],
[{'name': 'john', 'class': 'C'}, {'name': 'budi', 'class': 'C'}],
[{'name': 'charlie', 'class': 'E'}]]
如果你想的话,你也可以在dict中关闭类。
In [41]: {k: list(v) for k, v in groupby(students, itemgetter('class'))}
Out[41]:
{'A': [{'name': 'alex', 'class': 'A'}, {'name': 'richard', 'class': 'A'}],
'B': [{'name': 'harry', 'class': 'B'},
{'name': 'rudolf', 'class': 'B'},
{'name': 'gabriel', 'class': 'B'},
{'name': 'dessy', 'class': 'B'}],
'C': [{'name': 'john', 'class': 'C'}, {'name': 'budi', 'class': 'C'}],
'E': [{'name': 'charlie', 'class': 'E'}]}
你可以用 defaultdict
from collections import defaultdict
res = defaultdict(list)
for i in students:
res[i['class']].append(i)
print(list(res.values()))
产量
[[{'name': 'alex', 'class': 'A'}, {'name': 'richard', 'class': 'A'}],
[{'name': 'john', 'class': 'C'}, {'name': 'budi', 'class': 'C'}],
[{'name': 'harry', 'class': 'B'},
{'name': 'rudolf', 'class': 'B'},
{'name': 'gabriel', 'class': 'B'},
{'name': 'dessy', 'class': 'B'}],
[{'name': 'charlie', 'class': 'E'}]]
如果你想点 "芒种"。
students = [
{'name': 'alex','class': 'A'},
{'name': 'richard','class': 'A'},
{'name': 'john','class': 'C'},
{'name': 'harry','class': 'B'},
{'name': 'rudolf','class': 'B'},
{'name': 'charlie','class': 'E'},
{'name': 'budi','class': 'C'},
{'name': 'gabriel','class': 'B'},
{'name': 'dessy', 'class': 'B'}
]
classes = dict()
for student in students:
if student['class'] not in classes:
classes[student['class']] = []
classes[student['class']].append(student['name'])
all = []
for classroom in sorted(classes.keys()):
all.append([])
for student in classes[classroom]:
all[-1].append({'name':student,'class':classroom})
print (all)