Python中list.insert()报错:'str'无法解析为整数求助
问题分析与修复方案
错误根源
你在遍历列表d的同时往里面插入元素,会导致同一个元素被反复处理。比如第一次处理i=0时,你在索引0插入了"XOX",此时列表变成["XOX", 0, 1, ..., 87]。当循环再次遍历到i=0(这个元素现在在索引1的位置),i%8==0的条件依然成立,这时候执行d.insert(d[i], "XOX"),d[i]就是d[0],也就是已经插入的字符串"XOX"——而insert方法要求第一个参数必须是整数索引,自然就触发了'str' object cannot be interpreted as an integer错误。
另外,边遍历边插入还会导致后续插入的位置偏移,因为列表变长后,原索引对应的元素已经不是你预期的那个了。
修复方案
如果你想给每个8的倍数的元素前面都插入一个"XOX",可以用下面两种方法:
方法1:遍历原列表的副本
先复制一份初始列表,遍历副本的元素,这样就算修改原列表,也不会重复处理同一个元素:
d = list(range(88)) print(type(d[4])) # 遍历初始列表的副本,确保只处理一遍原始元素 for i in d.copy(): if i % 8 == 0: # 找到当前元素在原列表中的位置 idx = d.index(i) d.insert(idx, "XOX") print(d)
方法2:先收集位置再倒序插入
先把所有需要插入的位置找出来,然后从后往前插入——这样前面的插入操作不会影响后面的位置:
d = list(range(88)) print(type(d[4])) # 先找出所有值为8的倍数的元素的索引 insert_positions = [idx for idx, val in enumerate(d) if val % 8 == 0] # 倒序插入,避免位置偏移 for pos in reversed(insert_positions): d.insert(pos, "XOX") print(d)
额外说明
你初始代码里的d.insert(d[i], "XOX"),在列表未修改时等价于d.insert(i, "XOX")(因为d是range(88)生成的,d[i]就是i),但插入元素后d[i]就不等于i了,这也是问题的诱因之一。
内容的提问来源于stack exchange,提问作者cyberdyne
相关产品推荐
相关产品推荐

