bộ lọc mảng trong python?


84

Ví dụ, tôi có hai danh sách

 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 

Có một chức năng tích hợp trong python để làm điều này không?

Câu trả lời:


118

Nếu thứ tự không quan trọng, bạn nên sử dụng set.difference. Tuy nhiên, nếu bạn muốn duy trì trật tự, chỉ cần hiểu danh sách đơn giản là được.

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

CHỈNH SỬA: Như delnan nói, hiệu suất sẽ được cải thiện đáng kể nếu subset_of_Alà thực tế set, vì kiểm tra tư cách thành viên trong a setlà O (1) so với O (n) cho một danh sách.

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
Và điều này có thể được cải thiện rất nhiều bằng cách tạo ra subset_of_Amột thực tế set, cung cấp O(1)thử nghiệm thành viên (thay vì O(n)như với danh sách).

55

Có, filterchức năng:

filter(lambda x: x not in subset_of_A, A)

8
Lưu ý rằng trong Python 2, filtertrả về chính danh sách, trong khi trong Python 3, nó trả về một trình lặp.
modulitos

13
@modulitoslist(filter(...))
Paweł Kaczorowski

7

Không, không có chức năng tích hợp trong python để làm điều này, bởi vì đơn giản là:

set(A)- set(subset_of_A)

sẽ cung cấp cho bạn câu trả lời.


1
Trong khi làm việc này ví dụ của mình, có thể có vấn đề nếu yếu tố này được lặp đi lặp lại trong danh sách A.
Alok Mysore

6

set(A)-set(subset_of_A)cung cấp cho bạn tập kết quả dự kiến, nhưng nó sẽ không giữ lại thứ tự ban đầu. Sau đây là bảo quản đơn hàng:

[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

Điều này vừa được hỏi vài ngày trước (nhưng tôi không thể tìm thấy nó):

>>> 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]

Có thể tốt hơn nếu sử dụng sets ngay từ đầu, tùy thuộc vào ngữ cảnh. Sau đó, bạn có thể sử dụng các hoạt động tập hợp như các câu trả lời khác hiển thị.

Tuy nhiên, việc chuyển đổi danh sách thành tập hợp và quay lại chỉ cho các hoạt động này chậm hơn so với việc hiểu danh sách.


2

Sử dụng Setloại:

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])
>>> 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.