在 python 中按键对对象数组进行分组

Grouping an array of objects by key in python

假设我有一个对象数组。

arr = [
        {'grade': 'A', 'name': 'James'},
        {'grade': 'B', 'name': 'Tom'},
        {'grade': 'A', 'name': 'Zelda'}
      ]

我想要这个结果

{
   'A': [
            {'grade': 'A', 'name': 'James'},
            {'grade': 'A', 'name': 'Zelda'}
        ],
   'B': [ {'grade': 'B', 'name': 'Tom'} ]
}

使用dict.setdefault我们可以这样做:

import json
gradeList = [
    {"grade": 'A', "name": 'James'},
    {"grade": 'B', "name": 'Tom'},
    {"grade": 'A', "name": 'Zelda'}
]
gradeDict = {}
for d in gradeList:
    gradeDict.setdefault(d["grade"], []).append(d)

print(json.dumps(gradeDict, indent=4))

输出:

{
    "A": [
        {
            "grade": "A",
            "name": "James"
        },
        {
            "grade": "A",
            "name": "Zelda"
        }
    ],
    "B": [
        {
            "grade": "B",
            "name": "Tom"
        }
    ]
}

使用字典和setdefault:

setdefault(key[, default])

If key is in the dictionary, return its value. If not, insert key with a value of default and return default. default defaults to None.

arr2 = {}
for d in arr:
    t = arr2.setdefault(d['grade'], [])
    t.append(d)
>>> arr2
{'A': [{'grade': 'A', 'name': 'James'}, {'grade': 'A', 'name': 'Zelda'}],
 'B': [{'grade': 'B', 'name': 'Tom'}]}

我会使用 pd.Dataframe 并这样做:

import pandas as pd
df = pd.Dataframe(arr)    
for index, group in df.groupby('grade'):
    print(group)

您可以将数据写入您需要的任何内容,而不是 print(group),我想它不一定像您描述的那样是字典。

我会像这样做一个简单的循环:

arr = [{'grade': 'A', 'name': 'James'}, {'grade': 'B', 'name': 'Tom'}, {'grade': 'A', 'name': 'Zelda'}]

grouped_grades = {}

for item in arr:
    if item['grade'] not in grouped_grades:
        grouped_grades[item['grade']] = []
        
    grouped_grades[item['grade']].append(item)

print(grouped_grades)

输出:

{'A': [{'grade': 'A', 'name': 'James'}, {'grade': 'A', 'name': 'Zelda'}], 'B': [{'grade': 'B', 'name': 'Tom'}]}

我认为最简单的方法是使用 defaultdict。然后,如果需要,您可以将结果转换回普通字典,只需将其传递给构造函数,例如 dict(output).

from collections import defaultdict
output = defaultdict(lambda: [])

for item in arr:
    output[item['grade']].append(item)

您可以使用itertools.groupby

>>> keyfunc = lambda item: item['grade']
>>> {k:list(v) for k,v in itertools.groupby( sorted(arr,key=keyfunc) , keyfunc) } )
{'A': [{'grade': 'A', 'name': 'James'}, {'grade': 'A', 'name': 'Zelda'}], 'B': [{'grade': 'B', 'name': 'Tom'}]}