Как я могу проверить, был ли список узлов уже включен в список в списке списков? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть следующий список: 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. Как проверить, есть ли уже значение в списке в списке , но я зашел в тупик ..

Некоторое понимание этой проблемыбудет здорово!

Ответы [ 5 ]

0 голосов
/ 27 августа 2018

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]]
0 голосов
/ 27 августа 2018

Поскольку вы хотите проверить подсписки только так, как если бы они были подмножествами, вы можете преобразовать подсписки в наборы и затем использовать set.issubset() для теста:

s = map(set, a)
print([l for l in z for i in s if set(l).issubset(i)])

Этовыходы:

[[1, 2]]
0 голосов
/ 27 августа 2018

Вы можете использовать set s для сравнения, если узлы появляются в 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]]
0 голосов
/ 27 августа 2018
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_)
0 голосов
/ 27 августа 2018

Вы можете использовать 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...