比较两个字典列表,并在python中创建一个包含所有键和值的新列表

时间:2016-10-10 06:47:53

标签: python list dictionary

a = [{'a':{'a':1}}, {'b':{'b':1}}, {'c':{}}]
b = [{'a':{'a':1,'b':0}}, {'b':{'a':1}}]

这里有两个dict列表。我想比较这些并生成一个这样的新列表:

newlist = [{'a':{'a':1,'b':0}}, {'b':{'a':1,'b':1}}, {'c':{'a':0,'b':0}}]

2 个答案:

答案 0 :(得分:0)

A_list = [{'a':{'A':1}}, {'b':{}}]
B_list = [{'b': {'B': 1}}, {'a': {'A': 0}}]
list_with_all_keys = [{'a':{}}, {'b':{}}, {'c':{}}]
new_lod = [{k:{'A':(1 if k in A_list and 'A' in A_list[k] and A_list[k]['A'] is 1 else 0), 
               'B':(1 if k in B_list and 'B' in B_list[k] and B_list[k]['B'] is 1 else 0)}} 
           for k in [list(n.keys())[0] for n in list_with_all_keys]]
然后

new_lod [{'a': {'B': 0, 'A': 0}}, {'b': {'B': 0, 'A': 0}}, {'c': {'B': 0, 'A': 0}}]

请注意,我添加了一些大写字母,以澄清发生了什么,如果您只使用小写字母ab而不是A / {{分别为1}}和A_list / B

<强>旁注

我假设您没有在列表的第一级词典中获得重复键。我认为这是一个正确的假设,因为所需的输出会折叠第一级词典中的这些重复键。因此,您可以跳过列表并使用一个字典而不是字典列表。这略微简化了表达式。但是根据您的应用程序,可能会有更好的(说起来更简单)方法来比较或/和组合两个列表,词典或集合。

B_list

答案 1 :(得分:0)

更可读的方法是

a = [{'a':{'a':1}}, {'b':{'b':1}}, {'c':{}}]
b = [{'a':{'a':1,'b':0}}, {'b':{'a':1}}]

result = {}

for c in a + b:
    for key,value in c.items():
        result[key] = dict()
        result[key]['a'] = value.get('a', 0)
        result[key]['b'] = value.get('b', 0)

print(result)

会给你答案
{'c': {'a': 0, 'b': 0}, 'a': {'a': 1, 'b': 0}, 'b': {'a': 1, 'b': 0}}