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

2024-09-28 03:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 元素列表结构单字lightbrighthair双字
2条回答

这个解决方案使用蛮力来检查每个字符串与剩余的字符串(切片数组),justo的乐趣在于编写一个线性

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

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

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

相关问题 更多 >

    热门问题