Obtenga una lista que contenga elementos de cadena que excluyan elementos prefijados con cualquier otro elemento de la lista inicial
Tengo algunos problemas para filtrar una lista de cadenas. Encontré una pregunta similaraquí Pero no es lo que necesito.
La lista de entrada es:
l = ['ab', 'xc', 'abb', 'abed', 'sdfdg', 'abfdsdg', 'xccc']
y el resultado esperado es
['ab', 'xc', 'sdfdg']
El orden de los elementos en el resultado no es importante.
La función de filtro debe ser rápida porque el tamaño de la lista es grande
Mi solución actual es
l = ['ab', 'xc', 'abb', 'abed', 'sdfdg', 'abfdsdg', 'xccc']
for i in range(0, len(l) - 1):
for j in range(i + 1, len(l)):
if l[j].startswith(l[i]):
l[j] = l[i]
else:
if l[i].startswith(l[j]):
l[i] = l[j]
print list(set(l))
EDITAR
Después de múltiples pruebas con una gran entrada de datos, lista con 1500000 cadenas, mi mejor solución para esto es:
def filter(l):
if l==[]:
return []
l2=[]
l2.append(l[0])
llen = len(l)
k=0
itter = 0
while k<llen:
addkelem = ''
j=0
l2len = len(l2)
while j<l2len:
if (l2[j].startswith(l[k]) and l[k]!= l2[j]):
l2[j]=l[k]
l.remove(l[k])
llen-=1
j-=1
addkelem = ''
continue
if (l[k].startswith(l2[j])):
addkelem = ''
break
elif(l[k] not in l2):
addkelem = l[k]
j+=1
if addkelem != '':
l2.append(addkelem)
addkelem = ''
k+=1
return l2
para lo cual el tiempo de ejecución es de alrededor de 213 segundos
Muestra de datos de entrada - cada línea es una cadena en la lista