如何有效地减少列表:其他条目中未包含的条目

时间:2014-06-27 23:41:46

标签: python string performance python-2.7 search

我是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

1 个答案:

答案 0 :(得分:0)

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

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子字符串(由{{1表示) }})。如果这些索引中的任何一个返回val in ent True测试,则val in ent调用将返回any。我们要说的是,如果True不是val中包含的任何字符串的子字符串,则从out列表添加val,从当前{ {1}}索引。