簡體   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