You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

这里有两个关键问题:

  1. 内层循环完全多余:input_array.count(x)本身就会遍历整个数组统计x的出现次数,你不需要再嵌套一个遍历input_array的循环,这会导致重复统计很多次。
  2. 索引越界的直接原因:每次遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:43:14