Чи є швидкий спосіб перевірити, чи один комплект повністю містить інший?
Щось на зразок:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Чи є швидкий спосіб перевірити, чи один комплект повністю містить інший?
Щось на зразок:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Відповіді:
Це списки, але якщо ви дійсно маєте на увазі набори, ви можете використовувати метод issubset.
>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True
Для списку ви не зможете зробити краще, ніж перевірити кожен елемент.
issubset()
неcontains()
Для повноти: це еквівалентно issubset
(хоча, можливо, трохи менше явного / читабельного):
>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False
Один варіант залишається недоторканим - віднімання:
>>> {1, 2} - {1, 2, 3}
set([])
>>> {1, 2, 3} - {1, 2}
set([3])
В основному ви перевіряєте, які елементи у першому списку відсутні у другому списку.
Я знайшов це дуже зручним, оскільки ви могли показати, яких значень не вистачає:
>>> 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
Ви можете використовувати set.issubset()
або set.issuperset()
(або їх аналоги на основі оператора: <=
і >=
). Зверніть увагу, що методи прийматимуть як аргумент будь-який ітерабель , а не лише набір:
>>> {1, 2}.issubset([1, 2, 3])
True
>>> {1, 2, 3}.issuperset([1, 2])
True
Однак, якщо ви використовуєте оператори, обидва аргументи мають бути наборами:
>>> {1, 2} <= {1, 2, 3}
True
>>> {1, 2, 3} >= {1, 2}
True
Якщо ви підозрюєте, що набір є підмножиною іншого, і перетинаєте ці два набори разом, результат дорівнює самому собі, якщо це підмножина.
a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
A = set(a)
і B = set(b)
за осудність. Тоді це порівняння ефективно зводиться до len(A.intersection(B)) == len(A)
. Тобто не потрібно порівнювати самі набори ; потрібно порівнювати лише потужність цих наборів. Навіть цієї оптимізації, мабуть, недостатньо, щоб зробити цей підхід кращим. Значно більш читабельним і ефективним issubset()
і <=
підходи майже напевно , що всі хочуть.
Нижче функція повертає 0, якщо основний список не містить підспису повністю і 1, якщо містить повністю.
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)
.