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

1

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

Некоторая проницательность в этом вопросе будет замечательной!

  • 1
    Эмпирическое правило, когда вы проверяете, существует ли что-то уже, вероятно, вам нужен hashmap.
  • 0
    @JosephSeungJaeDollar Спасибо за внимание! К сожалению, я новичок в Python, и мне, вероятно, понадобится немало времени, чтобы «освоить» хешмэппинг ..: /
Показать ещё 3 комментария
Теги:
list
python-3.x
element
tuples

5 ответов

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]]
  • 0
    Я даже не знал, что эти ключевые слова существуют: o
  • 0
    Спасибо @ Ajax1234! Просто интересно, что делает оператор all ()?
Показать ещё 3 комментария
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]]
  • 0
    Спасибо, это тоже отличный ответ! Я не знал, что наборы можно использовать таким образом
1

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
    Спасибо за срыв! Ваш ответ так же прост и понятен, как @ Ajax1234's :)
1

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

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

Эти результаты:

[[1, 2]]
  • 0
    Спасибо за ваш ответ! Просто интересно, как на самом деле работает карта?
  • 0
    Вы имели a = map(set, a) виду a = map(set, a) потому что в настоящее время s = map(set, a) не используется, вы переопределяете s в понимании и все еще используете a . Примечание: это работает, потому что issubset() будет выполнять любую итерацию (это не происходит с оператором <= set).
Показать ещё 2 комментария
1
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
    Спасибо за ваш ответ! Просто чтобы уточнить, issubset() или мне нужно импортировать пакет?
  • 1
    issubset() - это метод для стандартного типа set , импорт не требуется.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню