Найти, если 2 элемента находятся в одном и том же подсписке - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть 2 списка слов,

list1 = ['hello', 'world']
list2 = ['hi']

и список подсписков, например

GROUPS = [['hello','good'], ['hello', 'hi', 'etc'], ['hi', 'world', 't']]

Какой самый быстрый (или наименьший код) способ найти, если каждая пара слов из list1 и list2 есть в подсписке? Находя и подсчитывая их.

Я использовал это, но я ищу лучший путь, если он существует:

found = 0
list_couples = []
for a in list1:
    for b in list2:
        for gr in GROUPS:
            if a in gr and b in gr:
                found += 1
                list_couples.append((a, b))
                break

Я хотел бы получить found = 2 и пару как [('hello','hi'), ('world', hi')].

Ответы [ 3 ]

3 голосов
/ 30 апреля 2020

Самое короткое, вероятно, следующее, используя itertools.product, next, set.issuperset, map и len:

from itertools import product

couples = []
for gr in map(set, GROUPS):  # make sets for O(1) contains-check
    pair = next((p for  p in product(list1, list2) if gr.issuperset(p)), None)
    if pair:
        couples.append(p)
found = len(couples)

Это повторяет набор set -cast groups и - для каждого - собирает next лучшая пара декартовых произведений из list1 и list2, для которой группа superset - если она существует.

Обратите внимание, что это очень эффективно, так как product и map создают ленивые итераторы, а next прерывается на ранней стадии при первом попадании, поэтому перебор пар не происходит.

2 голосов
/ 30 апреля 2020

Вы можете использовать список с product из itertools модуля:

from itertools import product

list_couples = []

for gr in GROUPS:
    list_couples.extend([(x[0], x[1]) for x in product(list1, list2) if x[0] in gr and x[1] in gr])
found = len(list_couples)
1 голос
/ 30 апреля 2020

Вы можете сделать это с помощью

from itertools import product

list1 = ['hello', 'world']
list2 = ['hi']
GROUPS = [['hello','good'], ['hello', 'hi', 'etc'], ['hi', 'world', 't']]
result = [i for i in product(list1, list2) if list(filter(lambda x: i[0] in x and i[1] in x ,GROUPS))]
found = len(result)

. При этом будут проверены все параметры в списках list1 и list2, если они существуют в одном из списков групп.

...