查找多个范围内的平均值

时间:2017-08-02 15:31:06

标签: 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)

此代码用于计算范围内的数字,但是有没有办法改变它,以便找到每个范围内所有数字的平均值?谢谢!

1 个答案:

答案 0 :(得分:0)

计算此类通常的方法称为 binning 。首先你要&#39; bin&#39;列表中的项目按大小(或涉及的任何标准),然后计算感兴趣的统计数据。为简单起见,我在此代码中使用相同大小的bin。

bins是一本字典。每个项的键是bin的上限值,字典值是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