如何将统计列表元素出现次数的for循环转换为正确的while循环?
问题分析与解决
首先看你错误的输出结果,比如索引8的位置值是24,而原aList里有3个8——24正好是8×3;索引5的位置是5,对应aList里1个5,5×1=5。这说明你在while循环里不是给对应计数加1,而是把元素本身的值累加上去了,这是逻辑上的核心错误。
原来的for循环逻辑很清晰:遍历aList里的每一个数字num,找到countList中索引为num的位置,给这个位置的数值加1(统计出现次数)。要转换成while循环,我们只需要模拟for循环的遍历过程即可:
正确的while循环实现
countList = 20 * [0] aList = [5,8,2,13,1,8,3,1,8] i = 0 # 初始化遍历用的索引变量 while i < len(aList): num = aList[i] # 取出当前索引对应的元素 countList[num] += 1 # 和for循环逻辑完全一致:对应索引的计数+1 i += 1 # 索引前进一位,准备遍历下一个元素 print(countList)
运行这段代码后,输出的countList就会和原for循环的结果完全一致:[0, 2, 1, 1, 0, 1, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
为什么你的代码会出错?
推测你错误的while循环可能写成了类似这样(逻辑错误示例):
# 错误示例,请勿使用 countList = 20 * [0] aList = [5,8,2,13,1,8,3,1,8] i = 0 while i < len(aList): num = aList[i] countList[num] += num # 错误:累加了元素本身的值,而非计数+1 i += 1
这种写法就会导致每个索引位置累加的是元素值,而不是出现次数,最终得到你看到的错误结果。
内容的提问来源于stack exchange,提问作者Lim Sook Yee
相关产品推荐
相关产品推荐

