我在当前这样的列表中有一个字典:

[ {'name': 'Joe',
   'score': 98,
   'subject': 'Math'},
{'name': 'Bob',
   'score': 90,
   'subject': 'Math'},
{'name': 'Bill',
   'score': 88,
   'subject': 'English'},
{'name': 'Jane',
   'score': 95,
   'subject': 'English'}]


我想将其重新组合或重组如下:

[ {'subject': 'Math',
  'Results': [{'name': 'Joe','score':98}, {'name':'Bob', 'score':90}]},
  {'subject': 'English',
  'Results': [{'name': 'Jane','score':95}, {'name':'Bill', 'score':88}]}
]


我尝试使用itertools.groupbydict.setdefault()作为建议的here,但不能完全得到我想要的。我怎样才能做到这一点?

最佳答案

通过一个小循环和dict.setdefault,您可以像这样进行分组:

码:

grouped = {}
for score in scores:
    grouped.setdefault(score['subject'], []).append(
        {k: v for k, v in score.items() if k != 'subject'})


分组后要获取其他输出格式:

grouped = [{'subject': k, 'Results': v} for k, v in grouped.items()]


测试代码:

scores = [
    {'name': 'Joe',
       'score': 98,
       'subject': 'Math'},
    {'name': 'Bob',
       'score': 90,
       'subject': 'Math'},
    {'name': 'Bill',
       'score': 88,
       'subject': 'English'},
    {'name': 'Jane',
       'score': 95,
       'subject': 'English'}]

grouped = {}
for score in scores:
    grouped.setdefault(score['subject'], []).append({
        k: v for k, v in score.items() if k != 'subject'})

print([{'subject': k, 'Results': v} for k, v in grouped.items()])


结果:

[
    {'subject': 'Math',
     'Results': [{'name': 'Joe', 'score': 98}, {'name': 'Bob', 'score': 90}]},
    {'subject': 'English',
     'Results': [{'name': 'Bill', 'score': 88}, {'name': 'Jane', 'score': 95}]}
]

10-06 00:53