У меня есть некоторые проблемы с фильтрацией списка строк. Я нашел аналогичный вопрос здесь, но это не то, что мне нужно.
Список входных данных:
l = ['ab', 'xc', 'abb', 'abed', 'sdfdg', 'abfdsdg', 'xccc']
и ожидаемый результат
['ab', 'xc', 'sdfdg']
Порядок элементов в результатах не важен
Функция фильтра должна быть быстрой, потому что размер списка большой
Мое текущее решение
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))
ИЗМЕНИТЬ
После нескольких тестов с большими входными данными, список с 1500000 строк, мое лучшее решение для этого:
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
для которого время выполнения составляет около 213 секунд
Примеры данных импорта - каждая строка представляет собой строку в списке