Python新手求助:统计列表数字频率时遭遇索引越界错误
问题分析与解决
首先,咱们来看看你遇到的list index out of range错误到底是怎么回事——问题出在你嵌套循环里的i += 1操作上,咱们一步步拆解:
错误根源
你原本的思路是遍历unique_numbers里的每个数字,统计它在input_array里的出现次数,但你的代码逻辑出了问题:
for un in unique_numbers: i = 0 for inp in input_array: counter = input_array.count(unique_numbers[i]) #统计频率 frequency_array.append(counter) #将统计结果加入频率数组 counter = 0 #重置计数器 i += 1 #将i值加1
这里有两个关键问题:
- 内层循环完全多余:
input_array.count(x)本身就会遍历整个数组统计x的出现次数,你不需要再嵌套一个遍历input_array的循环,这会导致重复统计很多次。 - 索引越界的直接原因:每次遍历
input_array里的一个元素,你都执行i += 1,而unique_numbers的长度(比如你的例子里是10个唯一数字)远小于input_array的长度(15个元素)。当i增加到10时,unique_numbers[i]就会访问超出列表范围的索引(因为列表索引从0开始,最大索引是9),这就触发了list index out of range错误。
修正你的代码
其实你只需要去掉多余的内层循环,直接遍历unique_numbers的每个元素,调用一次count就够了:
input_array = [3, 6, 8, 2, 4, 8, 3, 1, 8, 9, 7, 0, 5, 5, 1] unique_numbers = [] frequency_array = [] # 生成唯一数字数组 for inp in input_array: if inp not in unique_numbers: unique_numbers.append(inp) # 统计每个数字频率的代码(修正版) for un in unique_numbers: # 直接用当前的un统计次数,不需要i索引 counter = input_array.count(un) frequency_array.append(counter) # 转换成你想要的字典格式 result = {str(num): freq for num, freq in zip(unique_numbers, frequency_array)} print(result)
运行这段代码就能得到你期望的输出:{'3': 2, '6': 1, '8': 3, '2': 1, '4': 1, '1': 2, '9': 1, '7': 1, '0': 1, '5': 2}
更Pythonic的实现方式
作为Python初学者,其实有更简洁高效的方法来完成这个需求,比如用标准库的collections.Counter,它专门用来统计可迭代对象中元素的出现频率:
from collections import Counter input_array = [3, 6, 8, 2, 4, 8, 3, 1, 8, 9, 7, 0, 5, 5, 1] # 如果需要key是字符串类型,就把数组元素转成字符串 frequency_dict = Counter(map(str, input_array)) print(dict(frequency_dict))
如果不想用标准库的工具,也可以直接用字典来统计,比先找唯一数组再统计更高效:
input_array = [3, 6, 8, 2, 4, 8, 3, 1, 8, 9, 7, 0, 5, 5, 1] frequency_dict = {} for num in input_array: num_str = str(num) # 如果数字不在字典里,初始化为0 if num_str not in frequency_dict: frequency_dict[num_str] = 0 # 计数加1 frequency_dict[num_str] += 1 print(frequency_dict)
总结
你最初的思路是对的,但嵌套循环的逻辑错误导致了索引越界。核心问题是没有理解count方法的作用,以及错误地在不必要的内层循环里递增索引变量。希望上面的解释和代码能帮到你!
内容的提问来源于stack exchange,提问作者j618
相关产品推荐
相关产品推荐

