Python: los elementos de subconjunto en una lista basados ​​en subcadenas en otra lista, retienen solo un elemento por subcadena

Tengo dos listas:

list1 = ['abc-21-6/7', 'abc-56-9/10', 'def-89-7/3', 'hij-2-4/9', 'hij-75-1/7'] list2 = ['abc', 'hij'] 

Me gustaría subcontratar list1 de manera que: 1) solo se retengan los elementos con subcadenas que coincidan con un elemento en list2, y 2) para los elementos duplicados que cumplan con el primer requisito, deseo retener al azar solo uno de los duplicados. Para este ejemplo específico, me gustaría producir un resultado como:

 ['abc-21-6/7', 'hij-75-1/7'] 

He elaborado un código para cumplir mi primer requisito:

 [ele for ele in list1 for x in list2 if x in ele] 

El cual, basado en mi ejemplo específico, devuelve lo siguiente:

 ['abc-21-6/7', 'abc-56-9/10', 'hij-2-4/9', 'hij-75-1/7'] 

Pero estoy atascado en el segundo paso: cómo retener aleatoriamente solo un elemento en el caso de subcadenas duplicadas. Me pregunto si la función random.choice se puede incorporar de alguna manera en este problema. ¡Cualquier consejo será apreciado enormemente!

Puedes usar itertools.groupby :

 import itertools import random list1 = ['abc-21-6/7', 'abc-56-9/10', 'def-89-7/3', 'hij-2-4/9', 'hij-75-1/7'] list2 = ['abc', 'hij'] new_list1 = [i for i in list1 if any(b in i for b in list2)] new_data = [list(b) for a, b in itertools.groupby(new_list1, key=lambda x: x.split("-")[0])] final_data = [random.choice(i) for i in new_data] 

Salida:

 ['abc-56-9/10', 'hij-75-1/7'] 

Puede utilizar la siguiente función:

 def find(list1, findable): for element in list1: if findable in element: return element 

Ahora podemos usar una lista de comprensión:

 [find(list1, ele) for ele in list2 if find(list1, ele) is not None] 

Esto se puede acelerar sin la comprensión de la lista:

 result = [] for ele in list2: found = find(list1, ele) if found is not None: result.append(found) 

Puede usar un diccionario en lugar de una lista, y luego convertir los valores a una lista.

 list1 = ['abc-21-6/7', 'abc-56-9/10', 'def-89-7/3', 'hij-2-4/9', 'hij-75-1/7'] list2 = ['abc', 'hij'] final_list = {pref:ele for pref in list2 for ele in list1 if pref in ele} final_list = list(final_list.values()) 

esto daría como resultado:

 >>>final_list ['abc-56-9/10', 'hij-75-1/7']