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

Python 如何有效地减少列表:不包含在其他条目中的条目,python,string,performance,python-2.7,search,Python,String,Performance,Python 2.7,Search,我是Python新手。我减少字符串列表的代码需要很长时间才能执行。它的功能是:只查找列表中与同一列表中的其他字符串不部分匹配的字符串。这种代码有没有更有效的形式 下面的代码似乎比下面的代码更有效:any(如果item1.startswith(item1)或item1.endswith(item1),则我的清单1中的item1对应于item1)来自相关问题()。我用错了吗 现在,我只能在我的\u列表1中找到部分匹配项,它们开始或结束我的\u列表1中的其他条目。我想找到所有的部分匹配,甚至是中心匹配

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

下面的代码似乎比下面的代码更有效:
any(如果item1.startswith(item1)或item1.endswith(item1),则我的清单1中的item1对应于item1)
来自相关问题()。我用错了吗

现在,我只能在我的\u列表1中找到部分匹配项,它们开始或结束我的\u列表1中的其他条目。我想找到所有的部分匹配,甚至是中心匹配

#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
我希望我的清单2是:
['abcdef']

当我换线的时候

if item2.startswith(item1):


我在我的列表2中有数千个结果,几乎没有冗余,在我的列表2中结果为零。在搜索之前,您可以根据条目的长度对列表进行排序。这样,您就不需要在遍历每个条目时搜索整个列表中的部分匹配项,因为您知道当前条目之前的任何条目都不会是部分匹配项,因为它们太短了。像这样:

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:][/code>表示)之后的所有索引上迭代,并检查
val
子字符串是否包含在每个索引的任何字符串中(由
val in ent
表示)。如果对于ent中的
val
测试,这些索引中的任何一个返回
True
,则
any
调用将返回
True
。因此,我们要说的是,如果
val
不是
sul
中包含的任何字符串的子字符串,从当前的
sul
索引开始,将
val
添加到
out
列表中。

如果您的列表确实是您显示的整数列表,那么您的代码将无法工作
int
对象没有
.startswith()
方法。(无论如何,您要查看子字符串是否在字符串中的运算符是
in
)这是一个糟糕的示例,谢谢。我总是使用字符串列表,即使在处理整数时也是如此。@mattkaeo如果item2.startswith(item1)
您应该将
替换为
如果item2中的item1
,而不是
如果item1中的item2
@dano YES!我使用startswith从我的清单2中的3443项转到了1439项
if not any(val in ent for ent in s_l[i+1:])