2012-03-23 12 views
15

私は2つのリストを持ち、どちらも同じ数の辞書を含んでいます。各辞書には固有のキーがあります。 2番目のリストの最初のリストの各ディクショナリに一致するものがあります。これは、他のリストにユニークなキーが存在するディクショナリです。しかし、このような2つの辞書の他の要素は異なる場合があります。例:Pythonのユニークなキーを持つ辞書からなる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つの一致する辞書のすべての要素を比較したいと思います。いずれかの要素が等しくない場合は、等しくない要素を出力します。

あなたが助けてくださいだろう、

おかげ 敬具、その後

答えて

21

dictsはあなたの例の入力のように並んで、あなたはdictsの関連するペアのリストを取得するにはzip()機能を使用することができると仮定すると、あなたは差があるかどうかを確認するために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')]] 

NOTEを入力リストはまだソートされていない、あなたにも簡単にそれを行うことができます。

>>> from operator import itemgetter 
>>> list_1, list_2 = [sorted(l, key=itemgetter('unique_id')) 
         for l in (list_1, list_2)] 
+0

@Lattyware:はい、私はリストが一致するdictsが両方のリストの同じ位置にあるように並べられると仮定しています。これがOPが直面する状況だと私は思った。 –

+0

@ NiklasB.Definitely、しかし私は完全性のためにそれを言いたいと思った。 –

+0

@Niklas B .:はい、リストがソートされます。しかし、それはされていない可能性があります。リストがソートされていない場合、どうすればいいですか? – alwbtc

1

以下は辞書を比較し、等しくないアイテムを印刷する:

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 DDDzipを使用することで、一度に2つの辞書を繰り返し処理できます。次に、最初の辞書の項目を繰り返して、その値を2番目の辞書の対応する値と比較します。これらが等しくない場合は、キーと両方の値を出力します。

+0

辞書と同じ「unique_id」キーを比較する必要があることをどのように知っていますか? – alwbtc

+1

例に基づいて、辞書付きのリストが注文されたと仮定しました。そうでない場合は、最初に 'unique_id'でそれを注文する必要があります。 –

1

私は実際にしない特定のキーに依存バージョンを持っているので、要素が(ゼロ)に等しいまたはそれらは(非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 
この方法の側の
+0

'' 'cmp()' ''は何をしますか?あなたは私に '' cmp() '' ' –

+0

@ShubhamSrivastavaの実装を提供できますか?公式情報" cmp(x、y) からそれを読むことができます2つのオブジェクトxとyを比較し、戻り値はx yなら厳密に正の値です。 https://docs.python.org/2/library/functions.html#cmp – alemol

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. 
0
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 

パス古いものと新しいリスト

関連する問題