Удаление избыточных составных строк из списка строк - PullRequest
0 голосов
/ 06 марта 2020

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

my_list = ["lol hi there", "hi", "i like", "i like apples", "goodbye"]

можно преобразовать в:

my_list = ["lol hi there", "i like apples", "goodbye"]

, где такие строки, как "hi" и "i like" удаляются из my_list, потому что "hi" и "i like" находятся в строках "lol hi there" и "i like apples" соответственно. Они удаляются из списка исключительно из-за их появления в любой другой строке, найденной в списке, независимо от индекса в списке или положения в строке.

Другой пример: где:

my_list1 = ["hello", "he", "go", "goodbye", "good", ]

будет преобразовано в:

my_list1 = ["hello", "goodbye"]

из-за повторения "he" в "hello" и "go", а также "good" в "goodbye".

Я попытался использовать для этого следующий метод:

import re

my_list = ["lol hi there", "hi", "i like", "i like apples", "goodbye"]

for x in my_list:
    for y in my_list:
        if x != y:
            if len(x) < len(y):
                if re.search(x, y):
                    my_list.pop(my_list.index(x))
            else:
                if re.search(y, x):
                    my_list.pop(my_list.index(y))
print(my_list)

, который вернул мне то, что я хотел. Пользователь удалил свой вопрос, но я хочу знать более краткий способ решения этой проблемы. Может ли кто-нибудь помочь мне?

1 Ответ

0 голосов
/ 06 марта 2020

Если вас не интересует использование регулярных выражений, вы можете использовать оператор in.

my_list = ["lol hi there", "hi", "i like", "i like apples", "goodbye"]
filtered_list = []
for i,si in enumerate(my_list):
    # search each element against every other element in the list, j != i ensures it doesnt compare to self.
    inlist = any( [ si in xi for j, xi in enumerate(my_list) if j != i] )
    if not inlist:
        filtered_list.append( si )
print( filtered_list )

Или, если вы предпочитаете все это в одной строке:

filtered_list = [ si for i, si in enumerate( my_list ) if not any( [si in sii for j, sii in enumerate(my_list) if j != i] )]
print( filtered_list )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...