我有两张单子。我要从列表中删除包含第二个列表中的字符串的所有项。现在,我使用经典的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
正如您所说的,可能您应该查看codereview。无论如何,我非常肯定使用
sets
和intersection
操作会快得多。你知道吗看看这里:https://docs.python.org/2/library/stdtypes.html#set
调用
encode
是不必要的。每次调用upper
并不理想。为迭代处理列表是昂贵的。由于必须搜索元素和移动元素,因此移除更昂贵。计数intRemoved
也不是最好的方法。你知道吗相关问题 更多 >
编程相关推荐