我是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
答案 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}}索引。