首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用itemgetter对字典进行分组

如何使用itemgetter对字典进行分组
EN

Stack Overflow用户
提问于 2020-06-17 03:16:34
回答 3查看 78关注 0票数 1

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

代码语言:javascript
复制
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'}
]

我想将这些字典按类分组,将它们附加到一个列表中,并将每个列表附加到一个列表中:

代码语言:javascript
复制
[[{'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对前面的列表进行排序:

代码语言:javascript
复制
import itertools
from operator import itemgetter
students = sorted(students, key=itemgetter('class'))

如何将它们分组附加到列表中并创建列表列表?此外,在这种情况下使用集合会更好(顺序不重要,只要字典是按类分组的)。

EN

回答 3

Stack Overflow用户

发布于 2020-06-17 03:30:36

您可以使用defaultdict来完成此操作

代码语言:javascript
复制
from collections import defaultdict

res = defaultdict(list)
for i in students:
    res[i['class']].append(i)
print(list(res.values()))

输出

代码语言:javascript
复制
[[{'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'}]]
票数 3
EN

Stack Overflow用户

发布于 2020-06-17 03:22:46

groupby拯救了我们:

代码语言:javascript
复制
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'}]]

如果你愿意,你也可以在字典中键入off class:

代码语言:javascript
复制
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'}]}
票数 2
EN

Stack Overflow用户

发布于 2020-06-17 03:33:26

如果你想“手动”做这件事:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62416002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档