2017-10-12 10 views
2

두 튜플이 a = ((1, 'AB'), (2, 'BC'), (3, 'CD'))b = ((1, 'AB'), (2, 'XY'), (3, 'ZA'))입니다. 이들 2 개의 튜플을 분석함으로써, 튜플에있어서의 부정합이있는 것을 알 수있다. 즉, 은 a에 존재하지만, (2, 'XY')b에 존재한다.튜플에서 불일치 찾기 및 파이썬에서 병합하기

나는 이러한 불일치를 파악하고

result = ((2, 'BC', 'XY'), (3, 'CD', 'ZA')) 

(주문이 보존되어야합니다)

내가 보류 Comparing sublists and merging them입니다 잡을 수있는 가장 가까운 참조로 값이 튜플와 함께 할 필요가 있지만, 목록 용이며 튜플을 사용하는 방법을 찾을 수 없습니다.

이 작업을 수행 할 수있는 방법이 있습니까? (무시해야 또는 해당 값) a 또는 b에서 "키"가 누락이있을 수 없기 때문에

+2

코드는 지금까지 어디 있었습니까? 구체적으로 어디에서 붙어 있었습니까? – smarx

+0

@ Jean-FrançoisFabre이 경우를 무시할 수 있습니다. 불일치가있는 경우에만 결과에 터플에 항목이 있어야합니다. –

답변

5

, 나는 a에, 사전에 다음 루프를 b을 설정하고 값을 비교한다.

a = ((1, 'AB'), (2, 'BC'), (3, 'CD')) 
b = ((1, 'AB'), (2, 'XY'), (3, 'ZA')) 

b = dict(b) 

mismatches = [(k,v,b[k]) for k,v in a if b.get(k,v) != v] 

print(mismatches) 

결과 :

[(2, 'BC', 'XY'), (3, 'CD', 'ZA')] 

용액 (인해 딕셔너리 조회로) 빠른 거의 1 줄 수 있다는 장점을 가지고 있으며, 순서를 보존한다.

if b.get(k,v) != v 조건은 에 대해 b에없는 숫자를 가진 하나의 튜플을 가지고 있습니다.

[ai + (bi[1],) for ai, bi in zip(a, b) if ai != bi] 

과 : 목록은 튜플의 수의 순서를 보장하는 경우이 경우, 기본 get 반환 v의 값과 조건은 당신이 뭔가를 할 수 False

+0

'b.get (k)'대신'b.get (k, v)'를 쓰더라도 마찬가지입니다. –

+1

기본값으로 'a'의 값을 전달하지 않으면 ' 'a'가 여분의 키를 가지고있을 때 키 오류가 발생합니다. 시도 해봐. –

0

입니다 주문에 대한 보장이없는 경우 다음을 수행 할 수 있습니다.

[ai + (bi[1],) for ai, bi in zip(sorted(a), sorted(b)) if ai != bi]