Python通过一个对象键进行分组

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

有人知道Python中有一种方法(itertools.groupby,如果可能的话)通过对象键对对象数组进行分组,然后根据分组创建新的对象数组吗?例如,我有一个汽车对象数组:

 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)