Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用itemgetter对词典进行分组_Python_Dictionary_Itertools - Fatal编程技术网

Python 如何使用itemgetter对词典进行分组

Python 如何使用itemgetter对词典进行分组,python,dictionary,itertools,Python,Dictionary,Itertools,我有一个这样的字典列表: 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'}, {

我有一个这样的字典列表:

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'}]]
如果你想的话,你也可以在课堂上写一篇短文:

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'}]}
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'}]]
如果你想的话,你也可以在课堂上写一篇短文:

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来做

输出

[[{'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'}]]
你可以用defaultdict来做

输出

[[{'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)

如果要手动执行此操作,请执行以下操作:

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)

您是否尝试编写for循环来完成此操作?使用集合是否更好取决于您打算如何处理结果。是否尝试编写for循环来完成此操作?使用集合是否更好取决于您打算如何处理结果。