Python 如何有效地减少列表:不包含在其他条目中的条目
我是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中的其他条目。我想找到所有的部分匹配,甚至是中心匹配
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:])