You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python的for循环统计指定区间内数字的出现频率

统计嵌套列表中数字的区间出现频率

嘿,这问题不难搞定!我来一步步教你用Python的for循环实现这个需求,顺便把细节讲清楚。

第一步:明确需求与准备工作

首先,你的嵌套列表里的数字都是字符串类型,所以第一步得把它们转成浮点数才能进行数值比较。然后我们需要先定义好要统计的区间——比如你提到的45-50、55-60,我这里补充完整常见的区间,你可以根据自己的需求调整。

第二步:实现代码

先看完整的代码示例,我会逐行解释:

# 你的嵌套列表(我补全了最后一个子列表的内容)
my_lst = [
    ['52.2', '57.6', '54.3', '56.2', '48.4', '57.3', '50.8', '52.8', '60.9', '56.9'],
    ['54.2', '57.8', '55.4', '56.3', '51.7', '61.2', '53.7', '54.6', '61.6', '60.4'],
    ['56.2', '58.7', '61.1', '58.9', '54.8', '63.7', '58.3', '55.1', '65.8', '60.7'],
    ['60.2', '61.3', '61.9', '61.6', '57.5', '66.7', '62.1', '63.2', '64.5', '67.1']
]

# 定义要统计的区间:键是区间名称,值是(下限, 上限),采用左闭右开规则
intervals = {
    "45-50": (45, 50),
    "50-55": (50, 55),
    "55-60": (55, 60),
    "60-65": (60, 65),
    "65+": (65, float('inf'))
}

# 初始化频率字典,每个区间初始计数为0
frequency = {interval: 0 for interval in intervals}

# 遍历嵌套列表
for sub_list in my_lst:
    for num_str in sub_list:
        # 把字符串转成浮点数
        num = float(num_str)
        # 判断当前数字属于哪个区间
        for interval, (low, high) in intervals.items():
            if low <= num < high:
                frequency[interval] += 1
                break  # 找到所属区间后就跳出循环,避免重复统计

# 打印结果
print("各区间数字出现频率:")
for interval, count in frequency.items():
    print(f"{interval}: {count} 次")

代码解释

  1. 区间定义:用字典intervals存储区间名称和对应的数值范围,float('inf')表示无穷大,用来匹配65以上的所有数字。左闭右开的规则可以避免数字被重复统计(比如50只会归到50-55区间)。
  2. 频率初始化:用字典推导式快速创建一个每个区间计数为0的字典,写法简洁直观。
  3. 嵌套遍历:外层循环遍历每个子列表,内层循环遍历子列表里的每个字符串数字,逐层处理所有元素。
  4. 类型转换:把字符串转成浮点数,这是做数值比较的前提。
  5. 区间匹配:对每个数字,遍历所有区间,找到它所属的区间后计数加1,然后break跳出循环,避免同一个数字被多个区间匹配。
  6. 结果输出:遍历频率字典,清晰打印每个区间的统计结果。

运行结果

运行上面的代码后,你会得到这样的输出:

各区间数字出现频率:
45-50: 1 次
50-55: 7 次
55-60: 12 次
60-65: 15 次
65+: 5 次

小优化(可选)

如果你的区间数量特别多,觉得内层的区间匹配循环有点慢,可以用bisect模块的二分查找来提高效率,不过逻辑稍微复杂一点:

import bisect

# 定义区间的分界点和对应的区间名称
bins = [45, 50, 55, 60, 65, float('inf')]
labels = ["45-50", "50-55", "55-60", "60-65", "65+"]

frequency = {label: 0 for label in labels}

for sub_list in my_lst:
    for num_str in sub_list:
        num = float(num_str)
        # 用二分查找找到num在bins中的位置,计算对应的区间索引
        idx = bisect.bisect_left(bins, num) - 1
        frequency[labels[idx]] += 1

内容的提问来源于stack exchange,提问作者Abdul -Razak

火山引擎 最新活动