2014-12-05 3 views
3

두 개의 목록으로 구성된 두 개의 목록이 있습니다.두 요소로 된 하위 목록의 두 목록 사이의 대칭 차이는 어떻게 얻을 수 있습니까?

a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']] 
b = [['Rudolf', '40'], ['Adolf', '50']] 

하위 목록의 '키'첫 번째 요소를 기반으로 두 목록의 '대칭 차이'를 가져 오려고합니다.

이 '대칭 차이'

은 다음과 같습니다

가 모두 목록에 존재하기 때문에 다른 사람이 '는 등하면서 그래서,'아돌프 '항목이 제거 된
c = [['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15'], ['Rudolf', '40']] 

Rudolf '항목은 두 목록에 모두 존재하지 않기 때문에 포함되었습니다.

또 다른 예는 다음과 같습니다

a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']] 
b = [['Heinrich', '25']] 
c = [['Adolf', '10'], ['Hermann', '20']] 

내가이 일부 영리한 지능형리스트를 통해 달성해야한다고 생각을하지만 난 그것을 접근하는 방법을 아주 확실하지 않다.

c = [x for x in a_pairs if x not in b_pairs] 

답변

3

그런 다음, 각 목록에서 이름의 set (첫 번째 요소)를 만들어 이름의 집합의 대칭 차이를 얻을 것이다 ^를 사용할 수 있습니다. 그런 다음 목록 이해를 사용하여 각 목록을 반복하고 이름이 고유 집합에 있는지 확인한 다음 해당 두 가지 목록 내포 결과를 추가합니다.

def getDifference(x,y): 
    symDiff = set(i[0] for i in x)^set(i[0] for i in y) 
    return [i for i in x if i[0] in symDiff] + [i for i in y if i[0] in symDiff] 

먼저 예를

>>> a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']] 
>>> b = [['Rudolf', '40'], ['Adolf', '50']] 
>>> getDifference(a,b) 
[['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15'], ['Rudolf', '40']] 

두 번째 예는

>>> a = [['Adolf', '10'], ['Hermann', '20'], ['Heinrich', '30'], ['Heinrich', '15']] 
>>> b = [['Heinrich', '25']] 
>>> getDifference(a,b) 
[['Adolf', '10'], ['Hermann', '20']] 
+0

이 중대하다. 당신의 도움을 주셔서 대단히 감사합니다. 나는 세트의 멋진 기능을 알지 못했습니다! – d3pd

+1

사이드 노트와 마찬가지로, symmetric_difference()도 [set method] (https://docs.python.org/3/library/stdtypes.html?highlight=set#set.symmetric_difference)입니다. 'a'와'b'가 세트라면, 대칭 차이는'a.symmetric_difference (b)'또는'b.symmetric_difference (a)'를 통해 리턴 될 수 있습니다. – dagrha