通过键

时间:2015-12-07 07:50:16

标签: python dictionary

我有一个字典列表(从API中获取一些数据)假设:

alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}..]

alist中有多个词典重复出现。但是只有一个键具有重复词典中的不同值。因此,查询是:

通过在列表中保留单独的值来组合这些词典的最简单方法是什么?

像:

alist = [{'a':1, 'b':2, 'c':[3, 35, 87]}...]

更新 - 我有一个列表,用于指定重复的键,如:

repeated_keys = ['c',...] 

4 个答案:

答案 0 :(得分:2)

使用defaultdict更快)并从中生成字典 - 您还可以轻松地将该字典转换为列表。您可以修改j in i.keys()来过滤密钥。< / p>

from  collections import defaultdict as df

d=df(list)

alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}]

for i in alist:
    for j in i.keys():
        d[j].append(i[j])

print dict(d.items())

输出 -

{'a': [1, 1, 1], 'c': [3, 35, 87], 'b': [2, 2, 2]}

如果你想摆脱使用dict-comprehensionset的重复元素 -

>>>{k:list(set(v)) for k,v in d.items()}
>>>{'a': [1], 'c': [35, 3, 87], 'b': [2]}

答案 1 :(得分:1)

您可以使用列表理解:

result = [alist[0].copy()]
result[0]['c'] = [d['c'] for d in alist]

请注意,重新制作此列表几乎没有意义;毕竟,你将所有内容合并到一个字典中:

result = dict(alist[0], c=[d['c'] for d in alist])

如果您有多个重复键,则有两个选项:

  • 循环并获取每个密钥:

    result = alist[0].copy()
    for key in repeated:
        result[key] = [d[key] for d in alist]
    
  • 制作所有键列表,这样您就不必继续查阅重复键列表了:

    result = {}
    for key in alist[0]:
        result[key] = [d[key] for d in alist]
    

后一个选项可以通过迭代alist一次来实现:

result = {}
for d in alist:
    for key, value in d.items():
        result.setdefault(key, []).append(value)

答案 2 :(得分:1)

from collections import defaultdict
con_dict = defaultdict(list)
alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}]

for curr_dict in alist:
    for k, v in curr_dict.iteritems():
        con_dict[k].append(v)

con_dict = dict(con_dict)

我们创建一个类型列表的默认字典,然后迭代这些项目并将它们附加在右键中。

答案 3 :(得分:1)

可以获得结果。如果项目具有不同的值或者按原样保留,则必须测试是否要创建列表。

repeated_keys用于存储重复的密钥并计算它们重复的次数。

alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}]

z = {}
repeated_keys = {}
for dict in alist:
    for key in dict:
        if z.has_key(key):
            if isinstance(z[key], list):
                if not dict[key] in z[key]:
                    repeated_keys[key] +=1
                    z[key].append(dict[key])
            else:
                if z[key] != dict[key]:
                    repeated_keys[key] = 1
                    z[key] = [z[key], dict[key]]

        else:
            z[key] = dict[key]

print 'dict: ',z
print 'Repeated keys: ', repeated_keys

输出:

dict:  {'a': [1, 3], 'c': [3, 35, 87], 'b': 2}
Repeated keys:  {'c'}

如果:

alist = [{'a':1, 'b':2, 'c':3}, {'a':1, 'b':2, 'c':35}, {'a':1, 'b':2, 'c':87}, {'a':3,'b':2}]
输出应该是:

dict:  {'a': [1, 3], 'c': [3, 35, 87], 'b': 2}
Repeated keys:  {'a': 1, 'c': 2}