2014-07-10 2 views
1

나는 마스터 목록이 A이고 보조 목록이 B입니다. AB의 모든 요소를 ​​포함하며 추가 요소도 포함합니다. A의 값이 이 아니며이 아닌 값을 B에 입력하고 싶습니다. 예를 들어 :목록의 요소가 다른 목록에 있는지 찾기

A = ['two', 'roads', 'diverged', 'in', 'a'] 
B = ['roads', 'in'] 

내가 원하는 것은 :

for i in range(0, len(A)): 
    if 'roads' not in A[i]: 
     print A[i] 

그러나 I :

['two', 'diverged', 'a'] 

B는 하나 개의 요소가 포함 된 경우, 나는의 효과에 뭔가를 할 수 roads 말 B가 여러 요소를 가지고 있다면 붙어 있어야합니다. 나는 any() 기능을 찾았지만 문제가 해결되지 왜 확실하지 않다 :

for i in range(0, len(A)): 
    if any(B) not in A[i]: 
     print A[i] 

(나는 다른 답변 보았다,하지만 난이 아마도 다른 곳에서 요청 된 무엇을 찾고 찾을 수 없습니다.. 그렇다면, 당신은 또한 set(a) - set(b)을 수행하여 설정을 사용할 수 있습니다

+0

제목에 질문을 태그하지 마십시오. –

답변

5
[item for item in a if item not in b] 

). 두 번 묻는 나를 용서,하지만 난이 약간 느린 것으로 판단된다. 또한 세트를 사용하면 결과에 중복 값이 ​​제거되므로 원하는 결과가 아닐 수도 있습니다.

+1

'set'도 순서를 보존하지 않습니다. OP가 주문을 보존하고 싶어하는 것처럼 보입니다. – karthikr

+2

b가 큰 경우 b를 집합으로 만드는 것을 고려할 수 있습니다. – timgeb

+1

왜 세트 차이가 더 느릴 것으로 예상합니까? 길이 A와 B의 입력을 사용하면 설정 차는 O (AB) 대신 O (A + B)로 실행되어야합니다. 그것은 (나는 그것을 시도하지 않은) 더 나쁜 일정한 요인을 가지고 있을지도 모르지만 압도적으로 그렇게하지는 않을 것입니다. – user2357112

4

시도 목록 이해 :

[x for x in A if x not in B] 
1

허용 대답은 확실히 그 알고리즘의 복잡성은 N과 M은 AB의 길이입니다 O (N × M)는 여러 가지 목적에 가장 적합한된다. 대부분의 경우 (즉, AB이 지나치게 길지 않은 경우) 이는 중요하지 않습니다. 그러나 먼저 frozen setB 변환하여 처리 시간을 향상시킬 매우 긴리스트를 처리하고자하는 경우 :

tmp = frozenset(B) 
[i for i in A if i not in tmp] 

생성 복잡도 O (N + M)이다.

관련 문제