가장 큰 문제는 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.intersection
는
A
및
B
모두에있는 항목을 찾을 수 있습니다.
편집 : 당신의 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')}
목록에서 집합 작업을 사용할 수 있습니다. –
또한 사전을 사용하는 대신 클래스를 만드는 것을 고려해야합니다. –
@ Code-Apprentice emm, dict 대신 class를 list 요소로 사용하는 옵션입니다. 감사. – user7572446