Сопоставление похожих элементов между двумя списками

Я новичок в Python, поэтому извинения, если это глупый вопрос.

У меня есть два списка
L1=['marvel','audi','mercedez','honda'] а также

L2=['marvel comics','bmw','mercedez benz','audi'],

Я хочу извлечь соответствующие элементы, которые содержатся в list L2 в сочетании с list L1, Итак, что я сделал:

for i in L1:
   for j in L2:
       if j in i:
          print (j)

  output is ['audi']

Но я также хочу вернуть элементы, если они также состоят из любого слова, например mercedez в mercedez benz а также marvel в marvel comics, итоговый результат будет:

j=['audi','mercedez benz','marvel comics']

6 ответов

Решение

Я думаю, что вы действительно хотите здесь, это элементы L2 которые содержат какие-либо элементы в L1, Так просто замени if j in i с if i in j:

for i in L1:
   for j in L2:
       if i in j:
          print (j)

Это выводит:

marvel comics
audi
mercedez benz

Если вы хотите использовать regular expressions тогда вы можете сделать:

import re
re.findall(".*|".join(L1),"\n".join(L2))

['marvel comics', 'mercedez benz', 'audi']

Используя понимание списка:

[j for i in L1 for j in L2 if (j.startswith(i))]

['marvel comics', 'audi', 'mercedez benz']

Это один подход с использованием str.startswith

Пример:

L1=['marvel','audi','mercedez','honda']  
L2=['marvel comics','bmw','mercedez benz','audi']
res = []
for i in L2:
    for j in L1:
        if i.startswith(j):
            res.append(i)
print(res)

Выход:

['marvel comics', 'mercedez benz', 'audi']

С помощью in

Пример:

res = []
for i in L2:
    for j in L1:
        if j in i:
            res.append(i)
print(res)

Эффективный подход заключается в построении "плоского" словаря с каждым словом в качестве ключа и соответствующей группой слов в качестве значения.

L2=['marvel comics','bmw','mercedes benz','audi']    
match_dict = {k:v for v in L2 for k in v.split()}

который:

{'audi': 'audi',
 'benz': 'mercedes benz',
 'bmw': 'bmw',
 'comics': 'marvel comics',
 'marvel': 'marvel comics',
 'mercedes': 'mercedes benz'}

Теперь просканируйте первый список и выдайте элемент if в словаре:

L1=['marvel','audi','mercedes','honda']
result = [match_dict[x] for x in L1 if x in match_dict]

результат:

['marvel comics', 'audi', 'mercedes benz']

как только словарь построен, вы можете сканировать большие списки с высокой производительностью (O(1) уважать)

Сделайте некоторые изменения в вашем коде

for i in L2:
    for j in L1:
        if j in i:
            print (i)
Другие вопросы по тегам