Как я могу удалить строки, содержащиеся в другой строке, содержащейся в том же списке строк? - PullRequest
4 голосов
/ 09 апреля 2019

У меня есть список строк, и мне нужно удалить элементы, содержащиеся в других элементах, как показано:

a = ["one", "one single", "one single trick", "trick", "trick must", "trick must get", "one single trick must", "must get", "must get the job done"]

Мне просто нужно удалить каждую строку, содержащуюся в другой строке в том же списке, например: «один» содержится в «один единственный», поэтому его необходимо удалить, а затем «один единственный» содержится в «один единственный трюк» так что тоже надо сбросить

Я пробовал:

b=a
for item in a:
    for element in b:
        if item in element:
            b.remove(element)

ожидаемый результат:

a = ["trick must get", "one single trick must", "must get the job done"]

Любая помощь будет принята с благодарностью! Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 09 апреля 2019

Понимание списка должно делать это очень хорошо, в сочетании с любой функцией Python:

a = [phrase for phrase in a if not any([phrase2 != phrase and phrase in phrase2 for phrase2 in a])]

результат:

>>> a = ["one", "one single", "one single trick", "trick", "trick must", "trick must get", "one single trick must", "must get", "must get the job done"]
>>> a = [phrase for phrase in a if not any([phrase2 != phrase and phrase in phrase2 for phrase2 in a])]
>>> a
['trick must get', 'one single trick must', 'must get the job done']
2 голосов
/ 09 апреля 2019

Эффективный подход к решению проблемы в O (n) сложности времени состоит в том, чтобы использовать набор, который отслеживает все подфразы данной фразы, итерацию от самой длинной строки к самой короткой, и добавьте строку к выводу только в том случае, если ее нет в наборе подфраз:

seen = set()
output = []
for s in sorted(a, key=len, reverse=True):
    words = tuple(s.split())
    if words not in seen:
        output.append(s)
    seen.update({words[i: i + n] for i in range(len(words)) for n in range(len(words) - i + 1)})

output становится:

['one single trick must', 'must get the job done', 'trick must get']
1 голос
/ 09 апреля 2019

Неэффективное решение, но, сортируя по возрастанию от наименьшего и удаляя последний элемент, мы можем проверить, не появляется ли каждый где-либо как подстрока.

a = ['one', 'one single', 'one single trick', 'trick', 'trick must', 'trick must get', 
     'one single trick must', 'must get', 'must get the job done']
a = sorted(a, key=len, reverse=True)
b = []
for i in range(len(a)):
    x = a.pop()
    if x not in "\t".join(a):
        b.append(x)

# ['trick must get', 'must get the job done', 'one single trick must']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...