在多个范围内求平均值

2024-04-16 10:44:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找出列表中特定范围内数字的平均值。下面的代码是对类似问题的回答(Apply multiple Ranges to one list

import random
lisst = [209, 166, 38, 1090, 1091, 1092, 1099, 2011]
cnts = []
cnt = 0
up = 100
for num in sorted(lisst):
    if num <= up:
        cnt+=1
    else:
        while num > up:
            cnts.append(cnt)
            cnt=0
            up+=100
        cnt=1
cnts.append(cnt)
for i in range(len(cnts)):
    print(str(i*100+1) + "-" + str(i*100+100) + " = " + str(cnts[i]))

我试着编辑如下内容:

for integers in zip(range(0, 10**10, 10**7), range(10**7 +1, 10**10, 
10**7)):
    ave = sum(integers)/len(integers)

这段代码可以计算范围内的数字,但是有没有办法改变这一点,以便找到每个范围内所有数字的平均值?谢谢您!你知道吗


Tags: integers代码inforlenrange数字num
1条回答
网友
1楼 · 发布于 2024-04-16 10:44:14

这类计算的常用方法称为binning。首先按大小(或涉及的任何标准)对列表中的项目进行“装箱”,然后计算感兴趣的统计数据。为了简单起见,我在这段代码中使用了大小相等的箱子。你知道吗

bins是一本字典。每个项的键是bin的上限值,dictionary值是bin的计数和总和。当我们浏览清单的时候,我们在箱子里累积计数和总和。你知道吗

由于箱子的大小是相等的,我们可以使用一些计算技巧将lisst中的值转换成箱子数:((num - 1)//500)*500+500//是整数除法。(如果你不熟悉就试试看。)

经过lisst之后,我们按顺序打印出箱子,一边计算平均值。你知道吗

>>> lisst = [209, 166, 38, 1090, 1091, 1092, 1099, 2011]
>>> bins = { _: {'count': 0, 'sum':0} for _ in [500, 1000, 1500, 2000, 2500]}
>>> for num in lisst:
...     bins[((num - 1)//500)*500+500]['count'] += 1
...     bins[((num - 1)//500)*500+500]['sum'] += num
...     
>>> for bin in [500, 1000, 1500, 2000, 2500]:
...     bin, 'sum', bins[bin]['sum'], 'count', bins[bin]['count'], 'average', bins[bin]['sum'] / bins[bin]['count'] if bins[bin]['count'] else None
...     
(500, 'sum', 413, 'count', 3, 'average', 137.66666666666666)
(1000, 'sum', 0, 'count', 0, 'average', None)
(1500, 'sum', 4372, 'count', 4, 'average', 1093.0)
(2000, 'sum', 0, 'count', 0, 'average', None)
(2500, 'sum', 2011, 'count', 1, 'average', 2011.0)

编辑:标准格式的代码。你知道吗

lisst = [209, 166, 38, 1090, 1091, 1092, 1099, 2011]
bins = { _: {'count': 0, 'sum':0} for _ in [500, 1000, 1500, 2000, 2500]}
for num in lisst:
    bins[((num - 1)//500)*500+500]['count'] += 1
    bins[((num - 1)//500)*500+500]['sum'] += num

for bin in [500, 1000, 1500, 2000, 2500]:
    print (bin, 'sum', bins[bin]['sum'], 'count', bins[bin]['count'], 'average', bins[bin]['sum'] / bins[bin]['count'] if bins[bin]['count'] else None)

根据最新评论编辑:

lisst = [917529326, 1468789076, 1678667190, 647403601, 1713311112, 0]

bin_size = 10**7

bins_list = range(63*10**7,172*10**7+bin_size, bin_size)
bins = { _: {'count': 0, 'sum':0} for _ in bins_list}

outliers = []
for num in lisst:
    bin_number = ((num - 1)//bin_size)*bin_size+bin_size
    if not bin_number in bins:
        outliers.append(num)
        continue
    bins[bin_number]['count'] += 1
    bins[bin_number]['sum'] += num

print ('outlier values:', outliers)

for bin in bins:
    if bins[bin]['count']:
        print (bin, 'sum', bins[bin]['sum'], 'count', bins[bin]['count'], 'average', bins[bin]['sum'] / bins[bin]['count'] if bins[bin]['count'] else None)

输出:

outlier values: [0]
650000000 sum 647403601 count 1 average 647403601.0
1720000000 sum 1713311112 count 1 average 1713311112.0
1470000000 sum 1468789076 count 1 average 1468789076.0
1680000000 sum 1678667190 count 1 average 1678667190.0
920000000 sum 917529326 count 1 average 917529326.0

相关问题 更多 >