比较python

时间:2015-07-29 13:48:03

标签: python list

我在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]

3 个答案:

答案 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循环。