[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.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.다음은 사전을 비교하고 동일하지 않은 항목을 인쇄합니다.
다음은 사전을 비교하고 동일하지 않은 항목을 인쇄합니다.
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.나는 실제로 특정 키에 의존하지 않는 버전을 가지고 있으므로 요소는 동일하거나 (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.가장 빠르고 가장 포괄적 인 방법은 두 세트의 튜플을 사용하는 것입니다.
가장 빠르고 가장 포괄적 인 방법은 두 세트의 튜플을 사용하는 것입니다.
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.
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.
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
이 메소드의 측면에서 이전 목록과 새 목록을 전달하십시오.
from https://stackoverflow.com/questions/9845369/comparing-2-lists-consisting-of-dictionaries-with-unique-keys-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] PicklingError : <class 'decimal.Decimal'>을 pickle 할 수 없습니다 : decimal.Decimal과 같은 객체가 아닙니다. (0) | 2018.11.13 |
---|---|
[PYTHON] 어떻게 아마존 웹 서비스에서 boto3에서 URL을 생성하는 (0) | 2018.11.13 |
[PYTHON] 나누기에 사용할 때 '/'와 '//'의 차이점은 무엇입니까? (0) | 2018.11.13 |
[PYTHON] 파이썬 컴파일 된 확장 기능을위한 PyCharm 자동 완성 (0) | 2018.11.13 |
[PYTHON] 사전 조회를 사용하여 목록의 요소를 대체하는 방법 (0) | 2018.11.13 |