Python 删除基于部分字符串的冗余字符串

Python 删除基于部分字符串的冗余字符串,python,Python,我有一组查询,其中一些只是最终搜索字符串的一部分。我需要从很长的查询集合中清除部分字符串。是否有一种快速的方法可以跨越数百万个这样的集合 t = {u'house prices', u'how ', u'how man', u'how many animals go ex', u'how many animals go extinted eac', u'how many animals go extinted each ', u'how many species go', u'ho

我有一组查询,其中一些只是最终搜索字符串的一部分。我需要从很长的查询集合中清除部分字符串。是否有一种快速的方法可以跨越数百万个这样的集合

t = {u'house prices',
 u'how ',
 u'how man',
 u'how many animals go ex',
 u'how many animals go extinted eac',
 u'how many animals go extinted each ',
 u'how many species go',
 u'how many species go extin',
 u'how many species go extinet each yea',
 u'how many species go extinet each year?'}
我只想保留:

t = {u'house prices',
 u'how many species go extinet each year?',
 u'how many animals go extinted each '}
这是@Alex Hall的解决方案,经过编辑以捕获最后一个字符串(通过连接“-+-”可以实现这一点)


对集合进行排序以生成一个列表
q
,然后遍历该列表并建立一个新的元素列表,其中
不是q[i+1]。开始使用(q[i])
。应该能很好地完成这项任务。

对集合进行排序,以生成一个列表
q
,然后遍历它,并在
不是q[i+1]的地方建立一个新的元素列表。开始时使用(q[i])
。这个技巧应该做得相当好。

编辑:亚历克斯·霍尔的解决方案更好


对于每个集合,创建一个新集合并将集合的所有字符串插入其中。在生成的trie中,叶节点表示不是任何其他字符串前缀的字符串。通过良好的trie实现,运行时在字符串长度的总和上应该是线性的。

编辑:Alex Hall的解决方案更好


对于每个集合,创建一个新集合并将集合的所有字符串插入其中。在生成的trie中,叶节点表示不是任何其他字符串前缀的字符串。通过良好的trie实现,运行时在字符串长度的总和上应该是线性的。

集合仅适用于基于散列值的标识,但两个非常相似的字符串具有非常不同的散列值(根据设计),因此拥有一个集合不会给您带来任何好处。您仍然需要遍历所有内容,并可能设置您自己的索引。
“多少动物去了…”
?集合只使用基于哈希值的标识,但两个非常相似的字符串具有非常不同的哈希值(根据设计),因此拥有集合不会给您带来任何好处。您仍然需要循环所有内容,并可能设置您自己的索引。对于
“有多少动物去…”
?这是一个非常简单的解决方案,但对于长重叠字符串,不在q[i+1]中的
q[i]将花费大量时间。在CPython中,它应该非常快。我认为在常量因子范围内插入到trie中,长字符串将是一个更大的问题,特别是如果trie的实现是用python编写的。此外,字符串的性质表明它们不会太长。呃-我今天显然没有醒来,现在我意识到你的解决方案是优越的(不知怎么的,我想了一会儿,你应该以这种方式比较所有的字符串对)+1.谢谢@AlexHall,我编辑了我的问题,以显示您优雅的答案,在结尾的案例列表中添加了一个无意义的元素。这是一个非常简单的解决方案,但对于长重叠字符串,
q[I]不在q[I+1]
中需要很多时间。在CPython中,它应该非常快。我认为在常量因子范围内插入到trie中,长字符串将是一个更大的问题,特别是如果trie的实现是用python编写的。此外,字符串的性质表明它们不会太长。呃-我今天显然没有醒来,现在我意识到你的解决方案是优越的(不知怎么的,我想了一会儿,你应该以这种方式比较所有的字符串对)+1.谢谢@AlexHall,我编辑了我的问题,以显示您优雅的回答,在最终案例的列表中添加了一个无意义的元素。
# Print out the unique strings
q = sorted(list(t)) + ['-+-']
for i in range(len(q) - 1):
    if not q[i+1].startswith(q[i]):
        print i, q[i]