Я хочу найти и сравнить эффективно строковые элементы в списке, а затем удалить те, которые являются частью других строковых элементов в списке (с той же начальной точкой)

list1 = [ 'a boy ran' , 'green apples are worse' , 'a boy ran towards the mill' ,  ' this is another sentence ' , 'a boy ran towards the mill and fell',.....]

Я намерен получить список, который выглядит так:

list2 = [  'green apples are worse' , ' this is another sentence ' , 'a boy ran towards the mill and fell',.....]

Другими словами, я хочу сохранить самый длинный строковый элемент из тех элементов, которые начинаются с одинаковых первых символов.

5
No Holidays 24 Июн 2019 в 15:59

2 ответа

Лучший ответ

В соответствии с предложением Джон Колеман в комментариях, вы можете сначала отсортировать предложения, а затем сравнить последовательные предложения. Если одно предложение является префиксом другого, оно появится прямо перед этими предложениями в отсортированном списке, поэтому нам просто нужно сравнить последовательные предложения. Чтобы сохранить исходный порядок, вы можете использовать set для быстрого поиска отфильтрованных элементов.

list1 = ['a boy ran', 'green apples are worse', 
         'a boy ran towards the mill', ' this is another sentence ',
         'a boy ran towards the mill and fell']                                                                

srtd = sorted(list1)
filtered = set(list1)
for a, b in zip(srtd, srtd[1:]):
    if b.startswith(a):
        filtered.remove(a)

list2 = [x for x in list1 if x in filtered]                                     

После этого list2 выглядит следующим образом:

['green apples are worse',
 ' this is another sentence ',
 'a boy ran towards the mill and fell']

С O (nlogn) это значительно быстрее, чем сравнение всех пар предложений в O (n²), но если список не слишком длинный, гораздо более простое решение с помощью Vicrobot будет работать так же хорошо.

3
tobias_k 24 Июн 2019 в 14:03

Это способ, которым вы можете достичь этого:

list1 = [ 'a boy ran' , 'green apples are worse' , 'a boy ran towards the mill' ,  ' this is another sentence ' , 'a boy ran towards the mill and fell']
list2 = []
for i in list1:
    bool = True
    for j in list1:
        if id(i) != id(j) and j.startswith(i): bool = False
    if bool: list2.append(i)
>>> list2
['green apples are worse', ' this is another sentence ', 'a boy ran towards the mill and fell']
3
TJC World 24 Июн 2019 в 13:45