繁体   English   中英

如何:比较列表中的词典

[英]How to: Compare dictionaries within lists

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

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

x1 = [{'a':1,'b':"cat"},{'a':2,'b':"parrot"},...]
x2 = [{'a':2,'b':"dog"},{'a':1,'b':"fish"},...]

现在我想比较基于密钥的值,即密钥a,但两个列表的长度并不总是相同。 如果存在相应的字典,则密钥a将始终存在于两个字典中,即x1[0]['a'] == x2[1]['a']

我怎么能比较基于密钥的,这样我可以先抛弃那些从这些词典x1没有出现在x2 ,反之亦然。 然后确定某些值是否出现在两个字典中,然后将其记录在数据库中,这不是必需的。

我想的是将这些词典组合成基于键a的列表中的元组。 然后迭代这个并比较这些值。 这可能不是最好的方法,所以如果你有更好的想法,请随意。 :)

[编辑。]

我没有清楚地说出这个问题,对不起。 我希望做的是; first:匹配基于键a的词典。 第二:忽略那些不匹配的(键a)。 第三:比较密钥b。 第四:根据b的比较更新数据库。

感谢所有回答的人。

我的答案是这样的:

“我认为列表comp可能会很好地构建一个包含x1字典的元组,它与x2的字典相对应,然后迭代每个元组比较键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'] == b['a'] for a, b in zip(x1, x2) ]

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

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

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

此代码在一个方向上工作。 您可以将其调整到两个方向,或者只使用两次。

如果我正确理解你想要的是这样的东西,它可以通过将两个列表转换成带有'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')}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM