如何过滤列表中出现在同一列表python中较长元素的字符串元素?

How to filter string elements in the list which occurs in longer elements in the same list python?

我有一个列表,其中包含 ['love', 'hair', 'light', 'hair dryer', 'bright light', 'bright hair dryer'] 之类的元素,如果它们出现在三元组中,我想过滤单字或双字。我怎样才能做到这一点?最后我应该有['love', 'bright light', 'bright hair dryer']。具体来说,我需要从列表中删除头发,因为 'hair dryer' 包含它,但我也删除了 'hair dryer' 因为 'bright hair dryer' 有它。

您可以遍历按短语长度倒序排序的列表,并将每个可能的子短语添加到一个集合中,这样您就可以使用该集合检查当前短语是否为子短语上一个较长的短语:

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']

此解决方案使用蛮力检查每个字符串与其余字符串(切片数组),只是为了编写一个单行的乐趣。

如果顺序相反,它不会删除字符串,例如 "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']