在 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'}]}
假设我有一个对象数组。
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'}]}