Python - Найти список в списке списков - PullRequest
2 голосов
/ 22 марта 2019

У меня есть список списков, где каждый список может иметь произвольную длину, например:

list_of_lists = [[2, 2, 2, 3], [2, 3, 4], [2, 2, 6]]

Мне нужен способ поиска в этом списке списков для определенного списка.Например, функция contains(), которая возвращает True ниже:

list_of_lists.contains([2, 2, 6])

Я видел ответы, где «внутренние списки» могут быть преобразованы в кортежи, но это мне здесь не помогает.Есть ли библиотека с такой функцией?

Ответы [ 6 ]

1 голос
/ 22 марта 2019

Существует несколько ответов, предлагающих использовать in или ==, чтобы увидеть, содержит ли этот элемент элемент (другой список).
Однако, если вас не волнует порядок элементов в списках, которые вы сравниваете, вот решение этой проблемы.

import collections

# 'list_' is the list we are searching for in a bigger list 'list_of_lists'
for element in list_of_lists:
    if collections.Counter(element) == collections.Counter(list_) :
        return True

Приведенное выше решение требует, чтобы элементы были хэшируемыми.

Если вы находите collections слишком сложным для понимания, вы можете просто использовать set(list_) == set(element).

Вышеуказанные методы требуют, чтобы элементы были хэшируемыми. Если элементы не являются хэшируемыми, но сортируемыми, вы можете использовать sorted(list_)==sorted(element).

1 голос
/ 22 марта 2019

Использовать in:

print([2,2,6] in list_of_lists)

Или использовать __contains__:

print(list_of_lists.__contains__([2,2,6]))

(НЕ ИСПОЛЬЗОВАТЬ __contains__, НЕ РЕКОМЕНДУЕТСЯ)

1 голос
/ 22 марта 2019

Использование in:

list_of_lists = [[2,2,2,3],[2,3,4],[2,2,6]]

if [2,2,6] in list_of_lists:
    print("found")
else:
    print("not found")

OUTPUT

found

Аналогично, предположим, что последний список во вложенном списке был: [2, 2, 6, 8]

list_of_lists = [[2,2,2,3],[2,3,4],[2,2,6,8]]

if [2,2,6] in list_of_lists:
    print("found")
else:
    print("not found")

OUTPUT

not found

EDIT

Пока я занимался этим, если вы хотите иметь логическое значение для существования списка:

def chkList(lst):
    return True if lst in list_of_lists else False

list_of_lists = [[2,2,2,3],[2,3,4],[2,2,6]]
print(chkList([2,2,6]))

OUTPUT

True
0 голосов
/ 22 марта 2019

Пожалуйста, проверьте следующий код из ipython

In [18]: list
Out[18]: [[1, 2, 3], [4, 5, 6], [3, 2, 4]]

In [19]: def contains(sublist):
             if sublist in list:
                  return True
             else:
                  return False
   ....:             

In [20]: contains([1,2,3])
True

In [21]: contains(2)
False

In [22]: 
0 голосов
/ 22 марта 2019

На тот случай, если вам нужно более общее решение, проверяющее, является ли ваш целевой список на самом деле упорядоченным подсписком одного из внутренних списков.Уловка заключалась бы в преобразовании списка в строковое представление, которое позволяет эффективно проверять подстроки.

>>> list_of_lists = [[2,2,2,3],[2,3,4],[2,2,6,8]]
>>> serialize = lambda x: ','.join(map(str,x))
>>> any(serialize([2,2,6]) in serialize(item) for item in list_of_lists)
True
>>> any(serialize([2,2,7]) in serialize(item) for item in list_of_lists)
False
0 голосов
/ 22 марта 2019

Что делать, если вы что-то вроде

if any(list == [2, 2, 6] for list in list_of_lists):
    #execute whatever code you want for this case
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...