Как узнать, сколько списков появляется в элементе - PullRequest
0 голосов
/ 14 мая 2019

У меня есть несколько списков списков:

one = [[ham, egg], [sausage, bacon]]
two = [[pancake, bacon], [ham, egg]]
three = [[sausage, bacon], [butter, toast]]
four = [[ham, egg], [butter, toast]]

Что я хотел бы сделать, так это уметь перебирать эти списки и находить общие вхождения между ними. Как идея того, куда я хочу пойти с этим, я надеюсь, что результаты получатся такими:

One
[ham, egg]
matches with Two
[ham, egg]
matches with Four
[ham, egg]
One
[sausage, bacon]
matches with Three
[sausage, bacon]
Three
[butter, toast]
matches with Four
[butter, toast]

Мне довольно сложно добраться до этой точки. Я знаю, что вы можете перебирать список и сравнивать элементы списка с другими списками, но это не совсем понятно, например:

for item in one:
    if item in two or three or four:
for item in two:
    if item in one or three or four:

Можно ли просто сравнить все элементы списка с другими списками за один раз, чтобы получить ожидаемый результат?

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Вот рабочее решение:

one = [['ham', 'egg'], ['sausage', 'bacon']]
two = [['pancake', 'bacon'], ['ham', 'egg']]
three = [['sausage', 'bacon'], ['butter', 'toast']]
four = [['ham', 'egg'], ['butter', 'toast']]

lists = [one, two, three, four]
names = {0: 'one', 1: 'two', 2: 'three', 3: 'four'}

for i in range(len(lists)):
    for j in range(len(lists[i])):
        for k in range(i+1, len(lists)):
            if lists[i][j] in lists[k]:
                print("{} {} matches with {}".format(names[i], lists[i][j], names[k]))

Вывод будет:

one ['ham', 'egg'] matches with two
one ['ham', 'egg'] matches with four
one ['sausage', 'bacon'] matches with three
two ['ham', 'egg'] matches with four
three ['butter', 'toast'] matches with four
0 голосов
/ 14 мая 2019

Самый простой и, возможно, самый ясный способ - сделать что-то вроде этого:

mylists = [one, two, three, four]

for i, l in enumerate(mylists):
    for j, other in enumerate(mylists[:i] + mylists[i+1:]):
        for item in l:
            if item in other:
                print(i, j, item)

Если вам действительно нужно имя исходного списка в ваших журналах:

mylists = {'one': one, 'two': two, 'three': three, 'four': four}

for k1, l1 in mylists.items():
    for k2, l2 in mylists.items():
        if k1 == k2:
            continue
        for item in l1:
            if item in l2:
                print(f"item {item} from {k1} found in {k2}")

ДругойДля этого можно использовать библиотеку itertools :

for item1, lst2 in itertools.product(one, [two, three, four]):
    if item1 in lst2:
        print(f"{item1} match")
...