2つのリストがあり、どちらにも同じ数の辞書が含まれています。各辞書には一意のキーがあります。 2番目のリストの最初のリストの各辞書に一致があります。つまり、一意のキーを持つ辞書がもう1つのリストに存在します。しかし、そのような2つの辞書の他の要素は異なる場合があります。例えば:
list_1 = [
{
'unique_id': '001',
'key1': 'AAA',
'key2': 'BBB',
'key3': 'EEE'
},
{
'unique_id': '002',
'key1': 'AAA',
'key2': 'CCC',
'key3': 'FFF'
}
]
list_2 = [
{
'unique_id': '001',
'key1': 'AAA',
'key2': 'DDD',
'key3': 'EEE'
},
{
'unique_id': '002',
'key1': 'AAA',
'key2': 'CCC',
'key3': 'FFF'
}
]
2つの一致する辞書のすべての要素を比較したい。等しくない要素がある場合は、等しくない要素を出力します。
手伝ってくれませんか
入力例のようにdictsが並んでいると仮定すると、Zip()
関数を使用して、関連するdictsのペアのリストを取得できます。次に、any()
を使用して、違い:
>>> list_1 = [{'unique_id':'001', 'key1':'AAA', 'key2':'BBB', 'key3':'EEE'},
{'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}]
>>> list_2 = [{'unique_id':'001', 'key1':'AAA', 'key2':'DDD', 'key3':'EEE'},
{'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}]
>>> pairs = Zip(list_1, list_2)
>>> any(x != y for x, y in pairs)
True
または、異なるペアを取得するには:
>>> [(x, y) for x, y in pairs if x != y]
[({'key3': 'EEE', 'key2': 'BBB', 'key1': 'AAA', 'unique_id': '001'}, {'key3': 'EEE', 'key2': 'DDD', 'key1': 'AAA', 'unique_id': '001'})]
各ペアで一致しないキーを取得することもできます。
>>> [[k for k in x if x[k] != y[k]] for x, y in pairs if x != y]
[['key2']]
おそらく関連する値と一緒に:
>>> [[(k, x[k], y[k]) for k in x if x[k] != y[k]] for x, y in pairs if x != y]
[[('key2', 'BBB', 'DDD')]]
注:入力リストがまだソートされていない場合は、簡単にソートすることもできます。
>>> from operator import itemgetter
>>> list_1, list_2 = [sorted(l, key=itemgetter('unique_id'))
for l in (list_1, list_2)]
sets
のうち2つのtuples
を使用するのが最も速くて包括的な方法です。
set_list1 = set(Tuple(sorted(d.items())) for d in list1)
set_list2 = set(Tuple(sorted(d.items())) for d in list2)
intersection
を使用して検索重複:
set_overlapping = set_list1.intersection(set_list2)
symmetric_difference
を使用して検索differenceを検索
set_difference = set_list1.symmetric_difference(set_list2)
変換Tuple
dict
に戻る
for Tuple_element in set_difference:
list_dicts_difference.append(dict((x, y) for x, y in Tuple_element))
以下は辞書を比較し、等しくない項目を出力します:
for d1, d2 in Zip(list_1, list_2):
for key, value in d1.items():
if value != d2[key]:
print key, value, d2[key]
出力:key2 BBB DDD
。 Zip
を使用すると、一度に2つの辞書を反復処理できます。次に、最初のディクショナリのアイテムを反復処理し、その値を2番目のディクショナリの対応する値と比較します。これらが等しくない場合は、キーと両方の値を出力します。
特定のキーに実際には依存しないバージョンがあるので、要素は等しい(ゼロ)か、等しくない(非zer)です。
list_1 = [{'unique_id':'001', 'key1':'AAA', 'key2':'BBB', 'key3':'EEE'}, {'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}]
list_2 = [{'unique_id':'001', 'key1':'AAA', 'key2':'DDD', 'key3':'EEE'}, {'unique_id':'002', 'key1':'AAA', 'key2':'CCC', 'key3':'FFF'}]
list_3 = [{'Name': 'Abid', 'Age': 27},{'Name': 'Mahnaz', 'Age': 27}]
list_4 = [{'Name': 'Abid', 'Age': 27},{'Name': 'Mahnaz', 'Age': 27}]
print cmp(list_1,list_1)
print cmp(list_1,list_3)
print cmp(list_1,list_2)
print cmp(list_2,list_1)
print cmp(list_3,list_4)
与える:
Return Value : 0
Return Value : 1
Return Value : -1
Return Value : 1
Return Value : 0
Let list1 = []
list2 = []
To fetch all the key values we can do like this:
key_values = list1[0]
key = key_values.keys() //key is a list and contains all key values
below is a piece of code which compares all the key pair values:
for val in list1:
first_key = key[0]
for val2 in list2:
if val2[first_key] == val[first_key]:
for val3 in key:
if val2[val3] != val[val3]:
Unmatched.append(val)
print unmatched
Above contains matches dictionary and prints for which all key, pair values didn't match.
def new_change(old_list, new_list):
change_list = []
for x in new_list:
for y in old_list:
if x['unique_id'] != y['unique_id']:
change_list.append(x)
return change_list
このメソッドの側で新旧のリストを渡します