Как напечатать только последнее совпадение, используя itertools в python? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть следующий код:

p = ['a','b','c','d']
q = ['a','a','x','y','z']

for (p, q) in itertools.product(p, q):
    if p == q:
        print(q)

он печатает:

a
a

После добавления некоторых дополнительных журналов кажется, что первый элемент p сравнивается с первымэлемент q, затем первый элемент p со вторым элементом q, первый элемент p с третьим элементом q и т. д.

Как я могу изменить этот код так, чтобыэто будет печатать только последний матч?Таким образом, я хочу получить вывод a только один раз (из-за сравнения первого элемента p и второго элемента в q в данном случае)

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Если вы не можете позволить себе сначала превратить p и q в наборы, потому что они непомерно велики, вы можете добавить уже подходящие значения к набору и проверить его на включение:

p = ['a','b','c','d']
q = ['a','a','x','y','z']
seen = set([])

for a, b in itertools.product(p, q):
    if a == b and b not in seen:
        print(b)
        seen.add(b)
1 голос
/ 28 мая 2019

Почему бы просто не использовать набор для поиска общих символов в двух списках

p = ['a','b','c','d']
q = ['a','a','x','y','z']

print(set(p).intersection(set(q)))

Выход будет {'a'}

Или, если вы не можете использовать набор, соберите все совпадения в список и напечатайте последний элемент

import itertools

p = ['a','b','c','d']
q = ['a','a','x','y','z']

items = []
for (p, q) in itertools.product(p, q):
    #Collect all matches in a list
    if p == q:
        items.append((p,q))

#Print the last item
print(items[-1])

Выход будет ('a', 'a')

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

Чтобы сделать это, я просто изменил бы оба значения list с:

import itertools
p = ['a','b','c','d']
q = ['a','a','x','y','z']

for (x, y) in itertools.product(p[::-1], q[::-1]):
    if x == y:
        print(y)
        break

Вывод:

a
...