【问题标题】:How to efficiently reduce a list: Entries which are not contained in other entries如何有效地减少列表:不包含在其他条目中的条目
【发布时间】:2014-06-27 23:41:45
【问题描述】:

我是 Python 新手。我用于减少字符串列表的代码需要很长时间才能执行。它的功能是查找:仅列表中那些不与同一列表中的其他字符串部分匹配的字符串。这段代码有更有效的形式吗?

下面的代码似乎比下面的代码更有效:any(item1 for item in my_list1 if item1.startswith(item1) or item1.endswith(item1)) 来自相关问题 (Python list lookup with partial match)。我用错了吗?

现在,我只能在 my_list1 中找到部分匹配项,这些匹配项开始或结束了 my_list1 中的其他条目。我想找到所有部分匹配,甚至是中心匹配。

#My_list1 could be:
my_list=['abcd', 'abcde', 'abcdef', 'bcd', 'bcde', 'bcdef']

for item1 in my_list1:
    icount=0    
    for item2 in my_list1:
        if item2.startswith(item1): 
            icount+=1
        if icount>1:
            break
    if icount==1:
       my_list2.append(item1)
       print item1

所需的 my_list2 将是: ['abcdef']

当我换行时

if item2.startswith(item1):

if item2 in item1:

我从 my_list2 中的数千个结果(几乎没有冗余)到 my_list2 中的零个结果

【问题讨论】:

  • 如果您的列表确实是您显示的整数列表,那么您的代码将根本不起作用; int 对象没有 .startswith() 方法。
  • (不管怎样,你要查看子字符串是否在字符串中的运算符是in。)
  • 不好的例子,谢谢。我总是使用字符串列表,即使在处理整数时也是如此。
  • @mattkaeo 您应该将if item2.startswith(item1) 替换为if item1 in item2,而不是if item2 in item1
  • @dano 是的!我从 my_list2 中的 3443 个项目使用startswith 到 1439

标签: python string performance python-2.7 search


【解决方案1】:

您可以在搜索之前按条目的长度对列表进行排序。这样,当您遍历每个条目时,您不需要在整个列表中搜索部分匹配项,因为您知道当前条目之前的任何条目都不会是部分匹配项,因为它们太短了。像这样:

l = ['abcd', 'abcde', 'abcdef', 'bcd', 'bcde', 'bcdef']
s_l = sorted(l, key=len)
print("Sorted list is {}".format(s_l)
out = [val for i,val in enumerate(s_l)
         if not any(val in ent for ent in s_l[i+1:])]
print out

输出:

Sorted list is ['bcd', 'abcd', 'bcde', 'abcde', 'bcdef', 'abcdef']
['abcdef']

这篇文章可能会让人困惑:

if not any(val in ent for ent in s_l[i+1:])

它遍历当前索引之后的所有索引(由s_l[i+1:] 表示),并检查val 子字符串是否包含在每个索引处的任何字符串中(由val in ent 表示)。如果这些索引中的任何一个为val in ent 测试返回True,则any 调用将返回True。所以我们说,如果val 不是s_l 中包含的任何字符串的子字符串,则将val 添加到我们的out 列表中,从当前s_l 索引之后开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2016-10-22
    • 2018-12-10
    • 1970-01-01
    相关资源
    最近更新 更多