我有一个字典列表(从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',...]
答案 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-comprehension
和set
的重复元素 -
>>>{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}