如何:比较列表中的词典

时间:2013-12-10 10:59:16

标签: python list dictionary compare

我想知道你是否可以帮助我。

我有两个包含字典的列表,这些键大部分都是相同的。请参阅下面的简要示例:

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但我认为它可能太慢了。“

我认为这不是一个非常好的方法。这就是为什么我在这里:)

提前谢谢。

4 个答案:

答案 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) ]

您将获得比较结果列表。如果列表不是同等长,则较短的将确定比较的对数。

请注意,结果将是布尔值列表(TrueFalse)。如果您还需要其他任何内容,请更清楚地说明。

答案 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')}

可能有更快的方法可以做到这一点,但也许您可以确认这是否是您正在寻找的那种结果。