2017-02-22 1 views
0

dict 요소로 구성된 두 개의 목록을 파이썬에서 비교하려고합니다. 각 dict 요소에는 두 개의 키가 있습니다. 아래 샘플이 제공됩니다.[{}, {} ...] 비교를 위해 채택 할 수있는 파이썬 모듈이 있습니까?

A=[{'id':'u2s8Et','value':'David'},{'id':'u2s0PW','value':'Linda'},......] 
B=[{'id':'u2s8Et','value':'David'},{'id':'u2s7PA','value':'Steven'},......] 

비교하기 위해 채택 될 수있는 기존의 모듈이 있습니까 요소 목록 A를에서만 사용할 수 있으며, 목록 A의 어떤 요소 목록 B의 하나에서 다른 어떤 얻을 것으로 예상이야?

유닛 테스트 모듈에있어서 assertListEqual을 기대하지만, 일부 모듈 포괄적 바람직에 가깝다.

+0

목록에서 집합 작업을 사용할 수 있습니다. –

+0

또한 사전을 사용하는 대신 클래스를 만드는 것을 고려해야합니다. –

+0

@ Code-Apprentice emm, dict 대신 class를 list 요소로 사용하는 옵션입니다. 감사. – user7572446

답변

3

가장 큰 문제는 dict은 해시 가능하지 않다는 것입니다. 각 키의 키가 같기 때문에 tuple과 같은 해시 가능 유형으로 변환 할 수 있습니다.

def parse(values): 
    return set(map(tuple, map(dict.values, values))) 

>>> parse(A) 
>>> {('u2s0PW', 'Linda'), ('u2s8Et', 'David')} 

이제는 set 작업을 사용하여 각 요소를 비교할 수 있습니다.

In [6]: parse(A).difference(parse(B)) 
Out[6]: {('u2s0PW', 'Linda')} 

In [7]: parse(A).intersection(parse(B)) 
Out[7]: {('u2s8Et', 'David')} 

set.difference

A에 있지만 B 항목을 찾을 것이며, set.intersectionAB 모두에있는 항목을 찾을 수 있습니다.


편집 : 당신의 dict의 때문에 모두 같은 형식을 따라, 당신은뿐만 아니라하는 namedtuple 사용을 고려할 수 있습니다.

In [1]: from collections import namedtuple 

In [2]: entry = namedtuple("Entry", ("id", "value")) 

In [3]: A = [{'id':'u2s8Et', 'value':'David'}, {'id':'u2s0PW', 'value':'Linda'}] 
    ...: B = [{'id':'u2s8Et', 'value':'David'}, {'id':'u2s7PA', 'value':'Steven'}] 
    ...: 

In [4]: def parse_to_entry(values): 
    ...:  return {entry(d["id"], d["value"]) for d in values} 
    ...: 

In [5]: parse_to_entry(A) 
Out[5]: {Entry(id='u2s0PW', value='Linda'), Entry(id='u2s8Et', value='David')} 

In [6]: parse_to_entry(A).difference(parse_to_entry(B)) 
Out[6]: {Entry(id='u2s0PW', value='Linda')} 

In [7]: parse_to_entry(A).intersection(parse_to_entry(B)) 
Out[7]: {Entry(id='u2s8Et', value='David')} 
+0

굉장! nametuple은 좋은 솔루션입니다! – user7572446

1

set.intersection()set.difference과 같은 설정 작업을 사용할 수 있습니다. 또한 사전을 사용하는 대신 사용자 정의 클래스를 만드는 것을 고려해야합니다.