我正在编写一段遍历列表的代码,如果该项目符合特定条件,则会将其添加到其他列表中,并从当前列表中删除。例如:
for item in range(len(myList)):
if (Insert Condition):
newList.append(item)
del(myList[item])
这样做时,我收到“ 列表分配索引超出范围”错误。
这是因为循环必须经过的范围现在比列表本身长吗?
答案 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)]
这将删除原始列表。