Как отфильтровать строковые элементы в списке, которые встречаются в более длинных элементах в том же списке Python? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть список, который содержит такие элементы, как ['love', 'hair', 'light', 'hair dryer', 'bright light', 'bright hair dryer'], и я хочу отфильтровать одно- или двойные слова, если они встречаются в триграммах.Как я могу это сделать?В конце у меня должно было быть ['love', 'bright light', 'bright hair dryer'].В частности, мне нужно удалить волосы из списка, потому что 'hair dryer' содержит их, но также у меня есть удалить 'hair dryer', потому что 'bright hair dryer' есть.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Это решение использует грубую силу для проверки каждой строки на соответствие оставшимся (нарезая массив), просто для удовольствия написания одной строки.

Он не удаляет строку, если, например, порядок обратный"hair bright" не считается подпунктом "bright hair dryer".

[ e for i, e in enumerate(mylist) if not any([ e in s for s in mylist[:i] + mylist[i+1:] ]) ]

   #=> ['love', 'bright light', 'bright hair dryer']
0 голосов
/ 04 марта 2019

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

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

так что дано:

l = ['love', 'hair', 'light', 'hair dryer', 'bright light', 'bright hair dryer']

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

['bright hair dryer', 'bright light', 'love']
...