haciendo coincidir elementos similares entre dos listas

Soy nuevo en Python, así que pido disculpas si es una pregunta tonta.

Tengo dos listas
L1=['marvel','audi','mercedez','honda'] y

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

Quiero extraer elementos coincidentes que contengan en la list L2 coincidentes con la list L1 . Así que lo que hice:

 for i in L1: for j in L2: if j in i: print (j) output is ['audi'] 

Pero, también quiero devolver elementos si es que también consistan en una palabra como mercedez en mercedez benz y marvel en los marvel comics . por lo que la salida final sería:

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

Creo que lo que realmente quieres aquí son los elementos de L2 que contienen elementos en L1 . Así que simplemente reemplace if j in i con if i in j :

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

Esto produce:

 marvel comics audi mercedez benz 

Si desea utilizar regular expressions , puede hacer:

 import re re.findall(".*|".join(L1),"\n".join(L2)) ['marvel comics', 'mercedez benz', 'audi'] 

Este es un enfoque usando str.startswith

Ex:

 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) 

Salida:

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

Usando in

Ex:

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

un enfoque de rendimiento sería construir un diccionario “plano” con cada palabra como clave y el grupo relevante de palabras como valor.

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

cual es:

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

Ahora escanee la primera lista y el elemento del tema si está en el diccionario:

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

resultado:

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

Una vez que se construye el diccionario, puede escanear listas grandes con alto rendimiento (búsqueda O(1) )

Usando la lista de comprensión:

 [j for i in L1 for j in L2 if (j.startswith(i))] ['marvel comics', 'audi', 'mercedez benz'] 

Haz algunos cambios en tu código

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