我想知道你是否可以帮助我。
我有两个包含字典的列表,这些键大部分都是相同的。请参阅下面的简要示例:
x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"},...]
x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},...]
现在我想比较基于密钥的值,即密钥a,但两个列表的长度并不总是相同。如果存在相应的字典,即x1[0]['a'] == x2[1]['a']
,则密钥a将始终存在于两个字典中。
我如何根据键a比较这些词典,以便我可以首先丢弃x1
中未出现在x2
中的词典,反之亦然。然后确定某些值是否出现在两个字典中,然后将其记录在数据库中,这不是必需的。
我想的是将这些词典组合成基于键a的列表中的元组。然后迭代这个并比较这些值。这可能不是最好的方法,所以如果你有更好的想法,请随意。 :)
[编辑]
我没有清楚地说出这个问题,对不起。我希望做的是; first:匹配基于键a的词典。第二:忽略那些不匹配的(键a)。第三:比较密钥b。第四:根据b。
的比较更新数据库感谢所有回答的人。
我的答案是这样的:
“我认为列表comp可能会很好地构建一个包含x1
字典的元组,该字典与x2
中的字典对应,然后迭代每个元组比较键b但我认为它可能太慢了。“
我认为这不是一个非常好的方法。这就是为什么我在这里:)
提前谢谢。
答案 0 :(得分:2)
我没有真正得到你的比较,但我想你想要的是
len(x1)==len(x2) and all(a['a']==b['a'] for (a, b) in zip(x1, x2))
或等效(但效率较低),
[a['a'] for a in x1] == [b['a'] for b in x2]
答案 1 :(得分:1)
如果你只是打电话
[ a['a'] == b['a'] for a, b in zip(x1, x2) ]
您将获得比较结果列表。如果列表不是同等长,则较短的将确定比较的对数。
请注意,结果将是布尔值列表(True
,False
)。如果您还需要其他任何内容,请更清楚地说明。
答案 2 :(得分:1)
x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"}]
x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},{'a':3},{'a':2}]
[(_x2,_x2['a'] in [_x1['a'] for _x1 in x1]) for _x2 in x2]
[({'a': 2, 'b': 'dog'}, True),
({'a': 1, 'b': 'fish'}, True),
({'a': 3}, False),
({'a': 2}, True)]
此代码在一个方向上工作。您可以将其调整到两个方向,或者只使用两次。
答案 3 :(得分:1)
如果我正确理解你想要的是这样的东西,它可以通过将两个列表变为带有'a'值作为键的字典来工作。它假设每个列表中没有复制'a'值,并返回一个字典,其中'a'值为键,配对'b'的元组为值。
x1 = [{'a':1,'b':"cat"}, {'a':2,'b':"parrot"}, {'a': 3, 'b': 'dog'}]
x2 = [{'a':2,'b':"dog"}, {'a':1,'b':"fish"}]
x1_d = {d['a']: d['b'] for d in x1}
x2_d = {d['a']: d['b'] for d in x2}
matched_keys = set(x1_d) & set(x2_d)
result = {key: (x1_d[key], x2_d[key]) for key in matched_keys}
print result # {1: ('cat', 'fish'), 2: ('parrot', 'dog')}
可能有更快的方法可以做到这一点,但也许您可以确认这是否是您正在寻找的那种结果。