我有一个 list x=[0,1,1,2,3,5,8,3,1]
我只想删除奇数索引处的列表项即 x[1],x[3],x[5],...
等应该被删除。我的结果列表应该是x=[0,1,3,8,1]
def odd_indexed_list(x):
...
x = [0, 1, 1, 2, 3, 5, 8, 3, 1]
# ^ ^ ^ ^ ^
odd_indexed_list(x)
print(x)
# >> [0, 1, 3, 8, 1]
我想循环直到列表中只剩下一项。这是我的 odd_indexed_list()
版本
def odd_indexed_list(x):
n=len(x)
while(n>1):
for j in range(1,n+1,2):
del x[i]
错误是 - IndexError:列表分配索引超出范围
您正在尝试访问可能不再存在的索引。即:在迭代列表时不要修改列表。检查您的初始控制流,让我们看一个简单的示例:
x = [1, 2, 3]
其 len
为 3。但是,当您执行以下操作时:
del x[1]
x
现在的值为 [1, 3]
。 len
已更改,因此在循环开始时有效的最终索引 2
现在无效。该索引与列表的状态无关。
通过快速重构,这可以通过列表理解轻松完成:
x = list(range(20))
x = [a for i, a in enumerate(x) if not i%2]
x
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
TRONG enumerate
将生成可迭代的对 (index, element)
,并且 not i % 2
将确保索引是能被 2 整除(非奇数)。 enumerate
生成一个可以迭代的生成器,并且 index, element
对中的 index
直接与原始状态绑定(bind),使您能够准确地跳过您不想要的元素
Tôi là một lập trình viên xuất sắc, rất giỏi!