Как упоминается в заголовке, есть ли встроенные функции для выполнения этой задачи? Я искал это в dir(list)
, но не получил полезного. Спасибо.
Как проверить список, содержащийся в другом списке, без цикла?
Ответ 1
Зависит от того, что вы подразумеваете под "содержащимся". Возможно это:
if set(a) <= set(b):
print "a is in b"
Ответ 2
Предполагая, что вы хотите видеть, являются ли все элементы sublist
также элементами superlist
:
all(x in superlist for x in sublist)
Ответ 3
решение зависит от того, какие значения вы ожидаете от своих списков.
если есть возможность повторения значения, и вам нужно проверить, что в тестируемом контейнере достаточно значений, тогда это неэффективное время:
def contained(candidate, container):
temp = container[:]
try:
for v in candidate:
temp.remove(v)
return True
except ValueError:
return False
проверить эту функцию с помощью
>>> a = [1,1,2,3]
>>> b = [1,2,3,4,5]
>>> contained(a,b)
False
>>> a = [1,2,3]
>>> contained(a,b)
True
>>> a = [1,1,2,4,4]
>>> b = [1,1,2,2,2,3,4,4,5]
>>> contained(a,b)
True
Конечно, это решение может быть значительно улучшено: list.remove() потенциально занимает много времени и его можно избежать, используя умную сортировку и индексацию. но я не вижу, как избежать цикла здесь...
(во всяком случае, любое другое решение будет реализовано с использованием наборов или списков, которые используют внутренние циклы...)
Ответ 4
Вы можете использовать set
if set(a).issubset(b):
print('a is contained in b')