Пересечение двух списков в Python во избежание избыточного сопоставления - PullRequest
0 голосов
/ 17 июня 2020

У меня есть два python списков match1 и match2

match1 = ['Submit' , 'paper' , 'error' , 'code' , 'notcomplete' , 'next']

match2 = ['Submit' , 'paper' , 'error' , 'code' , 'blocked', 'paper' , 'next']

Сейчас , Я использовал __ contains __, чтобы найти общие слова между match1 и match2

common = filter(set(match1).__contains__,match2)

print(list(common))

Это дало мне следующий результат

['Submit' , 'paper' , 'error' , 'code' , 'paper' , 'next']

Слово paper во втором списке снова совпало со словом paper в первом списке.

Есть ли способ избежать этого и получить следующий вывод?

['Submit' , 'paper' , 'error' , 'code' , 'next']

Изменить:

Порядок в списке важен. Вот почему я использовал __ contains __, а не пересечение.

Меня не беспокоит наличие повторяющихся записей в списке общих слов. Я пытаюсь избежать повторного сопоставления одной и той же записи в match1 с другой записью в match2. Если бы в обоих списках было два 'paper', я бы взял их в общем списке как отдельные записи.

Ответы [ 5 ]

2 голосов
/ 17 июня 2020

Вы можете преобразовать список в набор, а затем использовать функцию пересечения в наборе, чтобы найти общие слова.

match1 = ['Submit' , 'paper' , 'error' , 'code' , 'notcomplete' , 'next']
match2 = ['Submit' , 'paper' , 'error' , 'code' , 'blocked', 'paper' , 'next']
match1_set = set(match1)
match2_set = set(match2)
print(match1_set.intersection(match2_set))
0 голосов
/ 17 июня 2020

Мне удалось найти на это ответ.

match1 = ['Submit' , 'paper' , 'error' , 'code' , 'notcomplete' , 'next']

match2 = ['Submit' , 'paper' , 'error' , 'code' , 'blocked', 'paper' , 'next']

common = list(filter(match1.__contains__,match2))

common_final = [w for w in match1 if w in common]

print(common_final)

Дает

['Submit' , 'paper' , 'error' , 'code' , 'next']

Спасибо всем, кто помог.

0 голосов
/ 17 июня 2020

Привет, Кришнадас, добро пожаловать в StackOverflow!

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

common = filter(set(match1).__contains__,set(match2))
0 голосов
/ 17 июня 2020

Вы можете использовать понимание списка, а затем пропустить его через set()

match1 = ['Submit' , 'paper' , 'error' , 'code' , 'notcomplete' , 'next']
match2 = ['Submit' , 'paper' , 'error' , 'code' , 'blocked', 'paper' , 'next']
print(set([x for x in match1 if x in match2]))
0 голосов
/ 17 июня 2020

Что, если вы просто удалите дубликаты, используя:

print(list(dict.fromkeys(list(common)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...