迭代时删除列表中的项目时,为什么索引超出范围?

时间:2019-10-30 21:09:05

标签: python python-3.x list

我正在编写一段遍历列表的代码,如果该项目符合特定条件,则会将其添加到其他列表中,并从当前列表中删除。例如:

for item in range(len(myList)):
    if (Insert Condition):
        newList.append(item)
        del(myList[item])

这样做时,我收到“ 列表分配索引超出范围”错误。

这是因为循环必须经过的范围现在比列表本身长吗?

2 个答案:

答案 0 :(得分:1)

  

这是因为循环必须经过的范围现在比列表本身长吗?

是的。循环开始时,循环只会获得列表的长度一次。如果列表最初包含10个元素,则您将从0循环到9。如果您从列表中删除元素,则最后一个索引将低于9,但是循环仍将一直进行到9,您将尝试访问不存在的列表索引。

您可以通过反向迭代来解决问题。

for item in range(len(myList), 0, -1):
    if (insert condition):
        newList.append(myList[item])
        del(myList[item])

之所以可行,是因为删除元素不会影响索引较低的元素。

答案 1 :(得分:0)

您可以这样创建两个新列表:

const [filter, dispatch] = useReducer(optionsReducer, initialValue);

useEffect(() => {
  filterData();
}, [filter]);

const handleFilter = (filter_type, selection) => {
  dispatch({ type: filter_type, option: selection.option });
};

如有必要,您可以得出以下结论:

newList = [item for item in myList if (Insert Condition)]
newMyList = [item for item in myList if not (Insert Condition)]

这将删除原始列表。