分配给列表的 Pythonic 方式

我有一个字典列表,它们都具有相同的键,例如


input = [                  

    {                      

        "animal": "Tiger"

        "country": "US",   

        "color": "yellow-black"   

    },                     

    {                      

        "animal": "Dog"

        "country": "UK",   

        "color": "brown"       

    },                     

    {                      

        "animal": "Tiger"

        "country": "Nepal",   

        "color": "yellow-black"     

    }                                                              

]  

我想创建一个新字典,其中对指定键(此处为动物)共享相同值的字典组合在一起。在对它们进行分组时,我想从初始词典中删除“动物”键。对于给定的例子,它会喜欢这个


output = {

        "Tiger":

        [{                      

            "country": "US",   

            "color": "yellow-black"   

        }, 

        {                      

            "animal": "Tiger"

            "country": "Nepal",   

            "color": "yellow-black"     

        }],

        "Dog": [

        {                      

            "country": "UK",   

            "color": "brown"       

        }]                     

}                                                                  

我用下面的代码实现了这一点,但我很确定必须有一种更优雅的方法来解决这个问题。是否可以将其写为单行?


grouped = dict((k, list(g)) for k, g in itertools.groupby(input, key=lambda x:x['animal'])) 

for k, g in grouped.items():                                                                  

    for i in range(len(grouped)):                                                             

        del g[i]['animal']  


红糖糍粑
浏览 168回答 3
3回答

森林海

最简单的方法可能是使用defaultdict. 我假设您实际上想"animal"在输出中删除标签,因为您在输入中也缺少逗号,因此很可能是拼写错误。from collections import defaultdictoutput = defaultdict(list)inp = [                      {                              "animal": "Tiger",        "country": "US",           "color": "yellow-black"       },                         {                              "animal": "Dog",        "country": "UK",           "color": "brown"           },                         {                              "animal": "Tiger",        "country": "Nepal",           "color": "yellow-black"         }                                                              ]  for item in inp:    output[item['animal']].append({k: v for k, v in item.items()                                    if k != 'animal'})根据您的字典中有多少键/值对,简单地从字典中删除键可能会更快,而不是使用字典理解来重建排除该键的字典。对于这种大小的样本,速度确实无关紧要,并且不会冒险改变您的初始数据。

BIG阳

这将是您的固定尝试 - 但它需要预先排序并且不如 defaultdict 有效:# fixed datadata = [ { "animal": "Tiger",  "country": "US",    "color": "yellow-black" },         {  "animal": "Dog",   "country": "UK",    "color": "brown" },          {  "animal": "Tiger", "country": "Nepal", "color": "yellow-black" } ] from itertools import groupby# groupby needs sorted keys if you want to group them together grouped = dict((k, list(g)) for k, g in groupby(sorted(data,key=lambda x:x["animal"]),                                                 key=lambda x:x['animal'])) # delete the animal keyfor k in grouped:    for inner in grouped[k]:        del inner["animal"]print(grouped)输出:{  'Dog': [{'country': 'UK', 'color': 'brown'}],  'Tiger': [{'country': 'US', 'color': 'yellow-black'},            {'country': 'Nepal', 'color': 'yellow-black'}]}独库:itertools.groupby()制作一个迭代器,从迭代中返回连续的键和组。键是为每个元素计算键值的函数。如果未指定或为 None,则 key 默认为标识函数并返回未更改的元素。通常,迭代需要已经在同一个键函数上排序。

撒科打诨

不会是一个衬垫,但defaultdict就是一个去与from collections import defaultdictd=defaultdict(list)for i in input:    d[i['animal']].append({k:v for k,v in  i.items() if k!='animal' })
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python