我想知道你能不能帮我。
我有两个包含字典的列表,在大多数情况下,这些键是相同的。有关简短的示例,请参见下文:
x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"},...]
x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},...]
现在我想比较基于键的值.key即 a,但两个列表的长度并不总是相同的。如果有相应的字典,则键 a 将始终在两个词典中,即 x1[0]['a'] == x2[1]['a']
.
我如何根据键 a 比较这些词典,以便我可以首先丢弃那些没有出现在x2
中的x1
词典,反之亦然。然后确定某些值是否出现在两个字典中,然后将其记录在数据库中,这里不需要。
我当时的想法是将这些词典组合成一个基于键 a 的列表内的元组。然后循环访问并比较这些值。这可能不是最好的方法,所以如果您有更好的想法,请随意。:)
[编辑。
我没有把问题说清楚,对不起。我希望做的是;第一:基于键 A 的匹配词典。第二:忽略不匹配的(键a(。第三:比较键 b. 第四:根据比较 b 更新数据库。
感谢所有回答的人。
我的答案是这样的:
"我认为列表组合可以构建一个元组,其中包含与x2
字典对应的x1
字典,然后迭代每个元组比较键 b,但我认为它可能太慢了。">
我不认为这是一个很好的方法。这就是我在这里:)
提前谢谢你。
我真的不明白你的比较,但我想你想要的是
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]
如果我理解正确,你想要的是这样的东西,它的工作原理是将两个列表变成以"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')}
可能有更快的方法可以做到这一点,但也许您可以确认这是否是您正在寻找的结果。
如果你只是打电话
[ a['a'] == b['a'] for a, b in zip(x1, x2) ]
您将获得比较结果列表。 如果列表不是同样长,则较短将确定比较了多少对。
请注意,结果将是一个布尔值列表(True
、False
(。 如果您想要其他任何东西,请更清楚地说明。
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)]
此代码在一个方向上工作。您可以将其调整为两个方向,也可以仅使用两次。