我在python中有两个列表
listA = [3000, 4000, 5000, 9200, 9800, 11000, 11320]
和
listB = [3500, 4500, 9500, 9900, 10500, 11191, 11593]
假设" n"是两个列表中所有元素的索引我有两个检查
listA[n] < listB[n-1]
如果这是真的,我必须删除这些 两个要素。
我正在使用以下代码:
for n in range(0, len(listA)):
if n == 0:
pass
else:
try:
if listA[n]<listB[n-1]:
listA.remove(listA[n])
listB.remove(listB[n-1])
n = n-1
except IndexError:
pass
应该删除9200和9800以上列表中的,因为它们小于9500和9900.但只删除了第一个。看起来在我的代码中,n = n-1在我的循环中没有效果。为什么?如何删除元素,我该如何回来再次检查?
如果我打印列表,这就是我得到的:
listA = [3000, 4000, 5000, 9800, 11000, 11320]
listB = [3500, 4500, 9900, 10500, 11191, 11593]
答案 0 :(得分:2)
一些事情。首先,不要修改您正在迭代的列表,使用中间结果列表。
其次,你可以从1而不是0开始。
另外,我执行此操作时使用if而不是remove,因为修改该用例的代码更快,但结果应该相同。
start_new = []
end_new = []
try:
for n in range(1, len(start)):
if not start[n]<end[n-1]:
start_new.append(start[n])
end_new.append(end[n-1])
end_new.append(end[n])
except IndexError:
pass
编辑:移动了try / except,因为如果它已经因indexerror而失败,则无法继续。
答案 1 :(得分:1)
Python for循环遍历迭代器,每次迭代它都会从迭代器中获取下一个元素。 iterable中的位置保持为迭代器的内部状态,与实际的循环变量无关。更改循环内的循环变量对下一次迭代没有任何影响。
您可以使用while
的{{1}} insteaf来使您的方法有效:
if
但是,最好避免在迭代时修改列表,因为这种方法非常容易出错。而是创建新列表,包括您要选择的元素。
答案 2 :(得分:1)
您似乎可以处理价值增加的列表,但我建议您使用open Parser
代替list.pop(index)
。如果相同的值可能发生两次,则后者似乎很危险。
另外,对于您的问题:您无法在list.remove(list[index])
循环中更新索引,因为在每次迭代时,for
都会分配迭代器的下一个值,无论您执行什么操作以前(因此,n
绝对没有效果)。如果要手动更改索引值,请改用n = n - 1
循环。