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