Python通过一个对象键进行分组
有人知道Python中有一种方法(itertools.groupby,如果可能的话)通过对象键对对象数组进行分组,然后根据分组创建新的对象数组吗?例如,我有一个汽车对象数组:Python通过一个对象键进行分组,python,json,list,group-by,Python,Json,List,Group By,有人知道Python中有一种方法(itertools.groupby,如果可能的话)通过对象键对对象数组进行分组,然后根据分组创建新的对象数组吗?例如,我有一个汽车对象数组: cars = [ { 'make': 'audi', 'model': 'r8', 'year': '2012' }, { 'make': 'audi', 'model': 'rs5', 'year': '20
cars = [
{
'make': 'audi',
'model': 'r8',
'year': '2012'
}, {
'make': 'audi',
'model': 'rs5',
'year': '2013'
}, {
'make': 'ford',
'model': 'mustang',
'year': '2012'
}, {
'make': 'ford',
'model': 'fusion',
'year': '2015'
}, {
'make': 'kia',
'model': 'optima',
'year': '2012'
},
]
我想创建一个新的汽车对象数组,该数组按make
分组:
newCarsList = {
'audi': [
{
'model': 'r8',
'year': '2012'
}, {
'model': 'rs5',
'year': '2013'
},
],
'ford': [
{
'model': 'mustang',
'year': '2012'
}, {
'model': 'fusion',
'year': '2015'
}
],
'kia': [
{
'model': 'optima',
'year': '2012'
}
]
}
我试过了,但是这个团员:
def key_func(k):
return k['make']
newCarsList = []
for key, value in groupby(cars, key_func):
newCarsList.append({key: value})
print(newCarsList)
但是它返回:[{'audi':},…]
并且找不到如何修复
有人能帮忙吗?这个
itertools.\u gropper
是一个iterable对象。您可以通过迭代来提取这些值。例如,您可以使用列表理解来提取元素,而不是追加{key:value}
,{key:[item For item in value]}
不过,您希望的输出似乎是一个dict
,而不是列表。你可以用它来画你的图案
result = {}
for key, value in groupby(cars, key_func):
result[key] = [item for item in value]
for item in result[key]:
del item['make']
编辑:最好不要添加我们将要删除的项目。可以这样做:
result = {}
for key, value in groupby(cars, key_func):
result[key] = [{subkey: subval for (subkey, subval)
in make.items() if subkey != 'make'}
for make in value]
itertools.\u grouper
是一个iterable对象。您可以通过迭代来提取这些值。例如,您可以使用列表理解来提取元素,而不是追加{key:value}
,{key:[item For item in value]}
不过,您希望的输出似乎是一个dict
,而不是列表。你可以用它来画你的图案
result = {}
for key, value in groupby(cars, key_func):
result[key] = [item for item in value]
for item in result[key]:
del item['make']
编辑:最好不要添加我们将要删除的项目。可以这样做:
result = {}
for key, value in groupby(cars, key_func):
result[key] = [{subkey: subval for (subkey, subval)
in make.items() if subkey != 'make'}
for make in value]
一个简单、功能性强的解决方案:
从操作员导入itemgetter
从itertools导入groupby
从functools导入部分
def del_ret(d,键):
德尔d[钥匙]
返回d
dict(map(lambda k_v:(k_v[0],tuple(map(partial(del_ret,key=“make”),k_v[1])),
groupby(汽车、项目获取者(“制造”))
将tuple
更改为list
,以获得与所需相同的输出。但我假设您不打算修改这些,所以在这些情况下,请始终使用tuple
。一个简单、功能性强的解决方案:
df=pd.DataFrame(cars)
print(df)
for mytuple in df.itertuples():
print(mytuple)
从操作员导入itemgetter
从itertools导入groupby
从functools导入部分
def del_ret(d,键):
德尔d[钥匙]
返回d
dict(map(lambda k_v:(k_v[0],tuple(map(partial(del_ret,key=“make”),k_v[1])),
groupby(汽车、项目获取者(“制造”))
将tuple
更改为list
,以获得与所需相同的输出。但是我假设您不打算修改这些,所以在这些情况下总是使用tuple
。您最好使用迭代器或避免双重迭代。编辑:是的,你的编辑已经完成了。你最好使用迭代器或者避免双重迭代。编辑:是的,你的编辑成功了。你的groupby语句的结果是什么?元组是否足够好groupby语句的结果是什么?元组足够好吗
df=pd.DataFrame(cars)
print(df)
for mytuple in df.itertuples():
print(mytuple)