У меня есть следующий список: a = [[1,2,3],[4,5,6],[7,8,9]]
который содержит 3 списка, каждый из которых является списком узлов графа.
Мне также дан кортеж узлов z = ([1,2], [4,9])
. Теперь я хотел бы проверить, включен ли какой-либо из списков в z
в список в a
. Например, [1,2]
находится в [1,2,3]
, a
, но [4,9]
не находится в [4,5,6]
, хотя есть перекрывающий узел.
Примечание. Чтобы уточнить, я также проверяю список подписок, или каждый элемент в списке находится в другом списке. Например, я рассматриваю [1,3] как "in" [1,2,3].
Как я могу это сделать? Я попытался реализовать что-то похожее на Python 3 Как проверить, уже ли значение в списке списка, но я достиг психологического тупика..
Некоторая проницательность в этом вопросе будет замечательной!
Вы можете использовать any
и all
:
a = [[1,2,3],[4,5,6],[7,8,9]]
z = ([1,2], [4,9])
results = [i for i in z if any(all(c in b for c in i) for b in a)]
Выход:
[[1, 2]]
Вы можете использовать set
для сравнения, если узлы появляются в a
, оператор <=
для множеств эквивалентен issubset()
.
Модуль itertools
предоставляет некоторые полезные функции, itertools.product()
эквивалентен вложенным for
циклов.
Например:
In []:
import itertools as it
[m for m, n in it.product(z, a) if set(m) <= set(n)]
Out[]:
[[1, 2]]
itertools.product
- ваш друг (без установки встроенного модуля python):
from itertools import product
print([i for i in z if any(tuple(i) in list(product(l,[len(i)])) for l in a)])
Выход:
[[1, 2]]
Поскольку вы только хотите проверить под-списки, как если бы они были подмножествами, вы можете преобразовать под-списки в наборы, а затем использовать set.issubset()
для теста:
s = map(set, a)
print([l for l in z for i in s if set(l).issubset(i)])
Эти результаты:
[[1, 2]]
a = map(set, a)
виду a = map(set, a)
потому что в настоящее время s = map(set, a)
не используется, вы переопределяете s
в понимании и все еще используете a
. Примечание: это работает, потому что issubset()
будет выполнять любую итерацию (это не происходит с оператором <=
set).
a = [[1,2,3],[4,5,6],[7,8,9]]
z = ([1,2], [4,9])
for z_ in z:
for a_ in a:
if set(z_).issubset(a_):
print(z_)
issubset()
или мне нужно импортировать пакет?
issubset()
- это метод для стандартного типа set
, импорт не требуется.