Как проверить список, содержащийся в другом списке, без цикла?

Как упоминается в заголовке, есть ли встроенные функции для выполнения этой задачи? Я искал это в 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')