用Python方式分配列表

时间:2019-03-01 18:59:33

标签: python python-3.x

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

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 个答案:

答案 0 :(得分:4)

最简单的方法可能是使用defaultdict。我假设您实际上是要在输出中放置rootCA.cer标记,因为您在输入中也缺少逗号,因此很可能是错字。

"animal"

根据您的词典中有多少个键/值对,可以简单地从词典中删除键,而不是使用词典理解来重建除该键之外的词典,这样会更快。对于这种大小的样本,速度的大小并不重要,也没有更改原始数据的风险。

答案 1 :(得分:2)

这是您的固定尝试-但需要进行预排序,并且效果不如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'}]}

Doku:

  

制作一个迭代器,该迭代器从迭代器中返回连续键和组。键是为每个元素计算键值的函数。如果未指定或为None,则键默认为标识函数,并返回不变的元素。通常,可迭代对象必须已经在相同的键函数上进行了排序。

答案 2 :(得分:0)

不是一个班轮,但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' })