복붙노트

[PYTHON] 파이썬에서 고유 한 키로 사전으로 구성된 2 개의 목록 비교

PYTHON

파이썬에서 고유 한 키로 사전으로 구성된 2 개의 목록 비교

나는 2 개의리스트를 가지고 있는데, 둘 다 동일한 수의 사전을 포함하고있다. 각 사전에는 고유 한 키가 있습니다. 두 번째 목록에있는 첫 번째 목록의 각 사전에 일치하는 항목이 있습니다. 즉, 다른 목록에 고유 키가있는 사전이 있습니다. 그러나 그러한 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 개의 사전의 모든 요소를 ​​비교하고 싶습니다. 요소 중 하나라도 같지 않으면 none-equal 요소를 인쇄하고 싶습니다.

도와 주시겠습니까?

감사 친애하는

해결법

  1. ==============================

    1.dicts가 예제 입력과 같이 정렬되었다고 가정하면 zip () 함수를 사용하여 연관된 dict 쌍 쌍 목록을 가져올 수 있으며 any ()를 사용하여 차이점이 있는지 확인할 수 있습니다.

    dicts가 예제 입력과 같이 정렬되었다고 가정하면 zip () 함수를 사용하여 연관된 dict 쌍 쌍 목록을 가져올 수 있으며 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)]
    
  2. ==============================

    2.다음은 사전을 비교하고 동일하지 않은 항목을 인쇄합니다.

    다음은 사전을 비교하고 동일하지 않은 항목을 인쇄합니다.

    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을 사용하면 한 번에 두 개의 사전을 반복 할 수 있습니다. 그런 다음 첫 번째 사전의 항목을 반복하고 그 값을 두 번째 사전의 해당 값과 비교합니다. 일치하지 않으면 키와 두 값을 인쇄합니다.

  3. ==============================

    3.나는 실제로 특정 키에 의존하지 않는 버전을 가지고 있으므로 요소는 동일하거나 (0이 아닌) (비 - 제로) :

    나는 실제로 특정 키에 의존하지 않는 버전을 가지고 있으므로 요소는 동일하거나 (0이 아닌) (비 - 제로) :

    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
    
  4. ==============================

    4.가장 빠르고 가장 포괄적 인 방법은 두 세트의 튜플을 사용하는 것입니다.

    가장 빠르고 가장 포괄적 인 방법은 두 세트의 튜플을 사용하는 것입니다.

    set_list1 = set(tuple(sorted(d.items())) for d in list1)
    set_list2 = set(tuple(sorted(d.items())) for d in list2)
    

    교차점을 사용하여 중복 찾기 :

    set_overlapping = set_list1.intersection(set_list2)
    

    symmetric_difference를 사용하여 차이점 찾기

    set_difference = set_list1.symmetric_difference(set_list2)
    

    튜플을 다시 dict로 변환하십시오.

     for tuple_element in set_difference:
         list_dicts_difference.append(dict((x, y) for x, y in tuple_element))
    
  5. ==============================

    5.

    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.
    
  6. ==============================

    6.

    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
    

    이 메소드의 측면에서 이전 목록과 새 목록을 전달하십시오.

  7. from https://stackoverflow.com/questions/9845369/comparing-2-lists-consisting-of-dictionaries-with-unique-keys-in-python by cc-by-sa and MIT license