我做得对吗?从python列表中删除项还有优化的余地吗?

2024-04-26 07:08:32 发布

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

我有两张单子。我要从列表中删除包含第二个列表中的字符串的所有项。现在,我使用经典的2循环方法,第一次我循环主列表的副本,然后检查每个项目是否包含第二个列表中的任何字符串。如果找到字符串,则删除该项。我可以用break结束第二个循环,因为不需要更多的查找(我们还是要删除这一行)。这工作得很好-正如您所看到的,我正在迭代列表的副本,所以删除元素不是问题。你知道吗

代码如下:

    intRemoved = 0

    sublen = len(mylist) + 1
    halflen = sublen / 2

    for i, line in enumerate(mylist[:], 1):
        for item in REM:
            if item.encode('utf8').upper() in line.text.encode('utf8').upper():
                if i < halflen:
                    linepos = i
                else:
                    linepos = (sublen - i) * -1

                mylist.remove(line)
                intRemoved += 1
                break

现在,我需要数据我删除了多少行(intRemoved)以及在列表中的位置(从列表的开头或结尾,这就是为什么它被拆分为两半)。正数表示从文件开头删除的行位置,负数表示从文件结尾删除的行位置。你知道吗

啊,是的,我忽略了这个案子。所以才会有。upper()。你知道吗

现在,既然我不是职业选手,我只想知道我是否做得对,从性能上看?我是不是做了不利于表现的事?有没有办法优化这个?你知道吗

桑克斯, D


Tags: 字符串in列表forifline副本item
2条回答

正如您所说的,可能您应该查看codereview。无论如何,我非常肯定使用setsintersection操作会快得多。你知道吗

看看这里:https://docs.python.org/2/library/stdtypes.html#set

调用encode是不必要的。每次调用upper并不理想。为迭代处理列表是昂贵的。由于必须搜索元素和移动元素,因此移除更昂贵。计数intRemoved也不是最好的方法。你知道吗

sublen = len(subsSrt) + 1
halflen = sublen / 2
filtered_list = []
rem_upper = [item.upper() for item in REM]
for i, line in enumerate(mylist, 1):
    text = line.text.upper()
    if any(item in text for item in rem_upper):
        if i < halflen:
            linepos = i
        else:
            linepos = (sublen - i) * -1
    else:
        filtered_list.append(line)
intRemoved = len(mylist) - len(filtered_list)

相关问题 更多 >