为什么我在Python中使列表索引超出范围?

时间:2013-02-13 16:48:50

标签: python arrays loops

我最近在这里问了一个问题:How do I find if an int is in array of arrays?并且解决方案效果很好。我正在尝试编写代码,如果另一个数组不包含它,将从数组中删除一个int。我试图使用的循环是:

for index in range(len(numbers)):
    if not any(numbers[index] in elem[:2] for elem in numbers2):
        numbers.remove(numbers[index])

说出numbers = [1, 2, 4]numbers2 = [[4,5,6], [2,8,9]]然后在循环之后,数字[]应为numbers = [2, 4]。然而,上面的循环不断产生错误exceptions.IndexError: list index out of range,但我不明白为什么错误会被抛出。任何人都可以帮忙解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

问题是len(numbers)仅在循环开始时评估过一次。

我会像这样改写整个事情:

In [12]: numbers = [1, 2, 4]

In [13]: numbers2 = [[4,5,6], [2,8,9]]

In [15]: n2s = set(reduce(operator.add, (n[:2] for n in numbers2)))

In [17]: [n for n in numbers if n in n2s]
Out[17]: [2, 4]

答案 1 :(得分:1)

创建时间列表并保存要删除的位置,然后在完成所有迭代后删除这些位置中的项目。请记住以相反的顺序删除以在删除时保留索引号。

to_remove = []
for index, number in enumerate(numbers):
    if not any(number in elem[:2] for elem in numbers2):
        to_remove.append(index)
for index in reversed(to_remove):
    del numbers[index]