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

时间:2019-03-03 23:44:20

标签: python python-3.x list filter n-gram

我有一个列表,其中包含诸如['love', 'hair', 'light', 'hair dryer', 'bright light', 'bright hair dryer']之类的元素,并且如果它们以Trigram出现,则希望过滤单个或两个单词。我怎样才能做到这一点?最后,我应该有['love', 'bright light', 'bright hair dryer']。具体来说,我需要从列表中删除头发,因为'hair dryer'包含了头发,但是我也删除了'hair dryer',因为'bright hair dryer'拥有了头发。

2 个答案:

答案 0 :(得分:0)

您可以按相反的顺序遍历按短语长度排序的列表,并将每个可能的子短语添加到集合中,以便可以使用该集合检查当前短语是否是短语的子短语。之前的较长短语:

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

答案 1 :(得分:0)

此解决方案使用蛮力对照其余字符串(对数组进行切片)来检查每个字符串,这只是为了编写一个衬板而带来的乐趣。

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