【问题标题】:Drop all strings that are a subset of another string in the same list删除属于同一列表中另一个字符串子集的所有字符串
【发布时间】:2019-04-15 23:15:36
【问题描述】:

我正在做一个抓取项目,出于某种原因,在某些段落中,我得到了完整的段落和同一段落的分段。所以,如果段落是“我的房子是绿色的,我喜欢它。”,我有时会得到:

["My house is green. I like it.", "My house is green.", "I like it."]

因此,当我将所有内容都转换为文本时,我会复制该段落。有什么方法可以检查哪些字符串是列表中其他字符串的子集?

在这种情况下,我想要的输出将只留下["My house is green. I like it."]

【问题讨论】:

  • 您是否有机会在抓取时只获取您想要保留的初始段落而不抓取其余部分? (而不是试图亲处理它?)
  • 为什么不能简单地使用该列表中的第一个元素?
  • 我也在想办法做到这一点。也许是因为我刮掉了所有后代我遇到了这个问题。
  • 如果你拿起一个只包含e的奇怪字符串会发生什么 - 这将是很多事情的子集等等......
  • @Selcuk 这是几个段落的列表,并不总是重复自己

标签: python string list set


【解决方案1】:

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

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 = ["My house is green. I like it.", "My house is green.", "I like it."]

output 变为:

['My house is green. I like it.']

【讨论】:

    【解决方案2】:

    我会像这样从列表中取出最长的字符串:

    arr = ["My house is green. I like it.", "My house is green.", "I like it."]
    print(max(arr, key=len))
    

    根据定义,最长的字符串不能是其他字符串的子字符串

    【讨论】:

    • 列表由多个段落组成。
    猜你喜欢
    • 2021-04-06
    • 2021-12-06
    • 1970-01-01
    • 2021-05-27
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多