2013-01-20 4 views
0

나는 두 개의리스트가 있는지 논리 값의 목록을 반환하는 방법 :파이썬 : 다른 목록에서 한 목록의 요소

A = [1,2,3,4,5,6,7,8] 
B = [2,3,4] 

을 길이 (A)의 부울 목록을하려는 각각의 요소

[False, True, True, True, False, False, False, False] 

함수를 작성하기 쉬운,하지만 패러다임가 있는지 알고 싶은 것 : 인덱스는 동일한 인덱스에있는 요소가 반환 값이 될 것이다 목록 B.에서 어디에 있는지 여부를 나타냅니다 파이썬에서하는 방법.

R에서, 상대방은

which(A %in% b) 

답변

5

는 지능형리스트를 사용하는 것 : 거대

In [164]: A = [1,2,3,4,5,6,7,8] 

In [165]: B = [2,3,4] 

In [166]: [x in B for x in A] 
Out[166]: [False, True, True, True, False, False, False, False] 

B 경우 더 나은 set 첫째로 변환. 마찬가지로, 집합에 대한 구성원 테스트는 O(1) 이고 목록의 경우 O(n)입니다.

In [167]: b=set(B) 

In [168]: [x in b for x in A] 
Out[168]: [False, True, True, True, False, False, False, False] 
+3

을'[164] :'당신에게 많은 시도를 툭 : P – rburny

+0

감사합니다 순전히. 궁금한 분은 R에서 나오는 NumPy에 자신을 맞추고 있습니다. 그리고 내가 할 최종 결과는 실제로 numpy.array (A에서 x는 B에서 x)입니다. – tylcole

3

또 다른 방법은 그것 (람다 사용을하지만이 느려질) 작성하려면 다음을

>>> A = [1,2,3,4,5,6,7,8] 
>>> B = [2,3,4] 
>>> S = set(B) 
>>> map(lambda x: x in S, A) 
[False, True, True, True, False, False, False, False] 
+1

lambda는 느립니다. –

+1

목록 보 완성은 맵 호출처럼 암시 적 루프로 변환되므로 버전이 더 빨라지는 이유가 없습니다. 또한 Ashwini가 언급 한 람다 오버 헤드가 있습니다. 내 기계에 대한 빠른 테스트 결과에 따르면 솔루션이 실제 속도가 느린 것으로 나타났습니다. A 및 B의 경우 50k/M, 길이가 500k/10M의 경우 약 100 %의 경우 약 25 %입니다. – l4mpi

+0

@ l4mpi :이 답변을 추가 했으므로 Ashwini가 그의 답변을 편집했습니다. 원래 그는 설정 전환에 대해 언급하지 않았습니다. (이는 제가 제안한 개선이었습니다). 당신의 마이크로 벤치 마크에 동의합니다. – rburny

3
In [1]: A = [1,2,3,4,5,6,7,8] 

In [2]: B = [2,3,4] 

In [3]: map(B.__contains__, A) 
Out[3]: [False, True, True, True, False, False, False, False] 
+0

아, 목록 작성과 직접적으로 동일한 map()이긴하지만 정말 좋습니다. – tylcole

관련 문제