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

2024-09-24 06:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python还不熟悉。我减少字符串列表的代码需要很长时间才能执行。它的功能是:只查找列表中那些与同一列表中的其他字符串不部分匹配的字符串。这个代码有没有更有效的形式?你知道吗

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

现在,我只能在我的\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):

if item2 in item1:

我从在我的\u列表2中有数千个结果(几乎没有冗余)变成了在我的\u列表2中没有结果


Tags: 字符串代码in功能列表forifmy
1条回答
网友
1楼 · 发布于 2024-09-24 06:28:07

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

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测试返回Trueany调用将返回True。因此,如果val不是s_l中包含的任何字符串的子字符串,则从当前s_l索引之后开始,将val添加到out列表中。你知道吗

相关问题 更多 >