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:
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_A
là thực tế set
, vì kiểm tra tư cách thành viên trong a set
là 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]
Có, filter
chức năng:
filter(lambda x: x not in subset_of_A, A)
filter
trả về chính danh sách, trong khi trong Python 3, nó trả về một trình lặp.
list(filter(...))
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.
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]
Đ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 set
s 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.
Sử dụng Set
loạ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
>>> 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])
>>>
subset_of_A
một thực tếset
, cung cấpO(1)
thử nghiệm thành viên (thay vìO(n)
như với danh sách).