Python遍历列表在大写字母前插入下划线时重复插入的原因
问题产生原因
异常来自两个逻辑漏洞:
for i in range(len(new))中的列表长度只在循环启动时计算一次,得到初始固定值,循环会按照初始长度固定执行对应次数,不会随着列表插入元素变长动态调整遍历范围。- 遍历过程中直接在原列表插入元素,会让插入位置之后的所有元素索引整体+1后移:
初始状态下大写字母
W在索引5位置
- i=5时,判断
new[5]是大写,在位置5插入_,此时W被挤到索引6位置- i=6时,判断
new[6]是W(大写),再次在位置6插入_,W被挤到索引7位置- 上述逻辑重复触发,直到循环走完固定次数,就会出现多个连续插入的下划线。
修复方案
推荐两种无副作用的实现方式:
方案1:倒序遍历原列表
从列表末尾往开头遍历,此时插入元素只会影响已经遍历过的高位索引,不会打乱还没遍历到的元素位置:
new = ["h", "e", "l", "l", "o", "W", "o", "r", "l", "d"] for i in range(len(new)-1, -1, -1): if new[i].isupper(): new.insert(i, "_") print(new) # 输出:['h', 'e', 'l', 'l', 'o', '_', 'W', 'o', 'r', 'l', 'd']
方案2:构造新列表(最稳妥,无索引问题)
遍历原列表时直接拼接生成新列表,全程不修改正在遍历的原数据,从根源避免索引错乱:
new = ["h", "e", "l", "l", "o", "W", "o", "r", "l", "d"] result = [] for c in new: if c.isupper(): result.append("_") result.append(c) print(result) # 输出:['h', 'e', 'l', 'l', 'o', '_', 'W', 'o', 'r', 'l', 'd']
内容的提问来源于stack exchange,提问作者Eric Lee
相关产品推荐
相关产品推荐

