为了账号安全,请及时绑定邮箱和手机立即绑定

分配给列表的 Pythonic 方式

分配给列表的 Pythonic 方式

红糖糍粑 2021-11-23 19:03:04
我有一个字典列表,它们都具有相同的键,例如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']  
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

最简单的方法可能是使用defaultdict. 我假设您实际上想"animal"在输出中删除标签,因为您在输入中也缺少逗号,因此很可能是拼写错误。


from collections import defaultdict


output = 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'})

根据您的字典中有多少键/值对,简单地从字典中删除键可能会更快,而不是使用字典理解来重建排除该键的字典。对于这种大小的样本,速度确实无关紧要,并且不会冒险改变您的初始数据。


查看完整回答
反对 回复 2021-11-23
?
BIG阳

TA贡献1859条经验 获得超6个赞

这将是您的固定尝试 - 但它需要预先排序并且不如 defaultdict 有效:


# fixed data

data = [ { "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 key

for 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 默认为标识函数并返回未更改的元素。通常,迭代需要已经在同一个键函数上排序。


查看完整回答
反对 回复 2021-11-23
?
撒科打诨

TA贡献1934条经验 获得超2个赞

不会是一个衬垫,但defaultdict就是一个去与


from collections import defaultdict

d=defaultdict(list)

for i in input:

    d[i['animal']].append({k:v for k,v in  i.items() if k!='animal' })


查看完整回答
反对 回复 2021-11-23
  • 3 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信