2017-09-10 3 views
0

나는 2 개의 목록을 입력으로 사용하고 두 개의 공통 요소가 중복되지 않은 세 번째 목록을 인쇄하는이 코드를 사용합니다.파이썬의 목록 보급에 여러 AND 조건을 사용하는 방법은 무엇입니까?

하나의 접근법은 잘 작동하고 예상 된 결과를 제공하는 주석 처리 된 루프입니다. 나는 목록 이해력으로 그것을 달성하려고 노력하고 있지만 중복을 준다.

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
c=[] 
# for i in a: 
#  if i in b and i not in c: 
#   c.append(i) 

c = [i for i in a if i in b and i not in c ] 
print c 

예상 결과 : [1, 2, 3, 5, 8, 13] 지능형리스트를 사용하여 중복으로

현재 결과 : [1, 1, 2, 3, 5, 8, 13]

나는 그것이 지능형리스트 내부에 내장되는 동안 목록 자체를 쿼리 할 수 ​​없습니다 파이썬 2.7

답변

4

을 사용하고 있습니다. i not in c 조건은 항상 목록 comp의 실행 직전에 c (빈 목록 [])의 동일한 값을 쿼리하므로 사용자 코드는 다음 반복 중에 마지막 반복에서 삽입 된 내용을 인식하지 못합니다.

c = set(a) & set(b) 
print(list(c)) 
[1, 2, 3, 5, 8, 13] # Warning! Order not guaranteed 

옵션 2

경우 : 순서는 문제가되지 않는 경우


옵션 1

, 당신은 단지 set 교차로를 수행 할 수

from collections import OrderedDict 

b = set(b) 
c = list(OrderedDict.fromkeys([i for i in a if i in b]).keys()) 
print(c) 
[1, 2, 3, 5, 8, 13] 
: OrderedDict의 사용에 주문 덕분에 유지하는 위의

c = [] 
b = set(b) 
for i in a: 
    if i in b and i not in c: 
     c.append(i) 

print(c) 
[1, 2, 3, 5, 8, 13] 

옵션 3

약간 빠른 버전 : 주문 문제는 for 루프를 사용