【问题标题】:How to filter string elements in the list which occurs in longer elements in the same list python?如何过滤列表中出现在同一列表python中较长元素中的字符串元素?
【发布时间】:2019-03-04 14:58:17
【问题描述】:

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

【问题讨论】:

  • 那么你的列表变成了['love', 'bright light', 'bright']?我不明白您是如何选择删除“头发”和“吹风机”的,您能否详细说明要删除的词的选择?
  • 如果一个字符串包含在一个较大的字符串中,我会删除较小的字符串。由于“吹风机”包含“头发”,而“亮吹风机”包含“吹风机”,我将两者都删除。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 2021-06-22
      • 2011-02-09
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多