파이썬의 배열 필터?


84

예를 들어, 두 개의 목록이 있습니다.

 A           = [6, 7, 8, 9, 10, 11, 12]
subset_of_A  = [6, 9, 12]; # the subset of A


the result should be [7, 8, 10, 11]; the remaining elements 

이 작업을 수행하는 파이썬에 내장 함수가 있습니까?

답변:


118

순서가 중요하지 않은 경우 set.difference. 그러나 순서를 유지하려면 간단한 목록 이해만으로 충분합니다.

result = [a for a in A if a not in subset_of_A]

편집 : delnan이 말했듯이, 목록의 O (n)에 비해 a의 멤버십을 확인하는 것이 O (1) 이기 때문에 subset_of_A실제 이면 성능이 크게 향상됩니다 .setset

A = [6, 7, 8, 9, 10, 11, 12]
subset_of_A = set([6, 9, 12]) # the subset of A

result = [a for a in A if a not in subset_of_A]

14
그리고 이것은 멤버십 테스트 를 제공 subset_of_A하는 real 을 만들면 크게 향상 될 수 있습니다 ( 목록 대신 ). setO(1)O(n)


7

아니요, 파이썬에는이 작업을 수행하는 함수가 없습니다. 그 이유는 다음과 같습니다.

set(A)- set(subset_of_A)

당신에게 답을 줄 것입니다.


1
이 그의 예를 들어 작동하는 동안 요소 목록 A. 반복되는 경우, 문제가있을 수 있습니다
알록 마이 소르을

6

set(A)-set(subset_of_A)의도 한 결과 집합을 제공하지만 원래 순서는 유지하지 않습니다. 다음은 주문 보존입니다.

[a for a in A if not a in subset_of_A]

5

tuple(set([6, 7, 8, 9, 10, 11, 12]).difference([6, 9, 12]))



3

이것은 며칠 전에 요청되었지만 찾을 수 없습니다.

>>> A = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A = set([6, 9, 12])
>>> [i for i in A if i not in subset_of_A]
[7, 8, 10, 11]

set컨텍스트에 따라 처음부터 s 를 사용하는 것이 더 나을 수 있습니다 . 그런 다음 집합 작업을 사용할 수 있습니다. 다른 답변과 같은 .

그러나 이러한 작업에 대해서만 목록을 집합으로 변환하고 다시 되 돌리는 것은 목록 이해보다 느립니다.


2

Set유형을 사용하십시오 :

A_set = Set([6,7,8,9,10,11,12])
subset_of_A_set = Set([6,9,12])

result = A_set - subset_of_A_set

1
>>> a = set([6, 7, 8, 9, 10, 11, 12])
>>> sub_a = set([6, 9, 12])
>>> a - sub_a
set([8, 10, 11, 7])

1
>>> A           = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A  = [6, 9, 12];
>>> set(A) - set(subset_of_A)
set([8, 10, 11, 7])
>>> 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.