Có cách nào nhanh chóng để kiểm tra xem một bộ hoàn toàn chứa bộ khác không?
Cái gì đó như:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Có cách nào nhanh chóng để kiểm tra xem một bộ hoàn toàn chứa bộ khác không?
Cái gì đó như:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Câu trả lời:
Đó là những danh sách, nhưng nếu bạn thực sự muốn nói đến các tập hợp, bạn có thể sử dụng phương thức Issubset.
>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True
Đối với một danh sách, bạn sẽ không thể làm tốt hơn việc kiểm tra từng phần tử.
issubset()
khôngcontains()
Đối với tính đầy đủ: điều này tương đương với issubset
(mặc dù được cho là ít rõ ràng / dễ đọc hơn một chút):
>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False
Một tùy chọn được giữ nguyên - phép trừ:
>>> {1, 2} - {1, 2, 3}
set([])
>>> {1, 2, 3} - {1, 2}
set([3])
Về cơ bản, bạn kiểm tra những yếu tố nào trong danh sách đầu tiên không có trong danh sách thứ hai.
Tôi thấy nó rất hữu ích vì bạn có thể hiển thị những giá trị nào bị thiếu:
>>> def check_contains(a, b):
... diff = a - b
... if not diff:
... # All elements from a are present in b
... return True
... print('Some elements are missing: {}'.format(diff))
... return False
...
>>> check_contains({1, 2}, {1, 2, 3})
True
>>> check_contains({1, 2, 3}, {1, 2})
Some elements are missing: set([3])
False
Bạn có thể sử dụng set.issubset()
hoặc set.issuperset()
(hoặc các đối tác dựa trên toán tử của chúng: <=
và >=
). Lưu ý rằng các phương thức sẽ chấp nhận mọi đối số có thể lặp lại , không chỉ là một tập hợp:
>>> {1, 2}.issubset([1, 2, 3])
True
>>> {1, 2, 3}.issuperset([1, 2])
True
Tuy nhiên, nếu bạn sử dụng toán tử, cả hai đối số phải là bộ:
>>> {1, 2} <= {1, 2, 3}
True
>>> {1, 2, 3} >= {1, 2}
True
Nếu bạn nghi ngờ một tập hợp là tập hợp con của tập hợp con khác và giao hai tập hợp đó với nhau, kết quả sẽ bằng chính nó nếu nó là tập hợp con.
a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
A = set(a)
và B = set(b)
cho sự tỉnh táo. Sau đó, sự so sánh này có thể giảm xuống một cách hiệu quả len(A.intersection(B)) == len(A)
. Có nghĩa là, bản thân các tập hợp không cần phải so sánh theo phần tử; chỉ cần so sánh bản số của các tập hợp này. Tuy nhiên, ngay cả sự tối ưu hóa này có lẽ là không đủ để làm cho phương pháp này trở nên thích hợp hơn. Các đột ngột dễ đọc hơn và hiệu quả issubset()
và <=
các cách tiếp cận là gần như chắc chắn những gì mọi người muốn.
Hàm bên dưới trả về 0 nếu danh sách chính không chứa đầy đủ danh sách con và 1 nếu chứa đầy đủ.
def islistsubset(sublist,mainlist):
for item in sublist:
if item in mainlist:
contains = 1
else:
contains = 0
break;
return contains
any(item in mainlist for item in sublist)
.