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

Как упоминается в заголовке, есть ли встроенные функции для этой работы? Я искал это в dir(list), но не нашел нужного.

Ответы [ 4 ]

37 голосов
/ 06 апреля 2010

Зависит от того, что вы подразумеваете под «содержанием». Может быть, это:

if set(a) <= set(b):
    print "a is in b"
12 голосов
/ 06 апреля 2010

Предполагая, что вы хотите увидеть, все ли элементы sublist также являются элементами superlist:

all(x in superlist for x in sublist)

3 голосов
/ 06 апреля 2010

решение зависит от того, какие значения вы ожидаете от своих списков.

если есть возможность повторения значения, и вам нужно проверить, достаточно ли значений в тестируемом контейнере, то вот неэффективное по времени решение:

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 () потенциально занимает много времени и его можно избежать с помощью умной сортировки и индексации. но я не вижу, как избежать петли здесь ...

(в любом случае, любое другое решение будет реализовано с использованием наборов или списочных представлений, которые используют циклы внутренне ...)

0 голосов
/ 14 июня 2019

Возможно, вы захотите использовать set

if set(a).issubset(b):
    print('a is contained in b')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...