Skip to main content
 首页 » 编程设计

python之一个区间有多少数据

2025年05月04日14lonelyxmas

我有一个list对象,想知道某个区间有多少个数?代码如下

a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28] 
interval = 3 
a = list(map(lambda x:int(x/interval),a)) 
for i in range(min(a),max(a)+1): 
    print(i*interval,(i+1)*interval,':',a.count(i)) 

输出

0 3 : 2 
3 6 : 4 
6 9 : 5 
9 12 : 1 
12 15 : 1 
15 18 : 1 
18 21 : 0 
21 24 : 0 
24 27 : 0 
27 30 : 1 

是否有一种简单的方法来获取这些信息?越简单越好

请您参考如下方法:

既然我们正在谈论性能,我想提供我的 numpy 解决方案使用 bincount :

import numpy as np 
 
interval = 3 
a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28] 
l = max(a) // interval + 1 
b = np.bincount(a, minlength=l*interval).reshape((l,interval)).sum(axis=1) 

(如果 max(a) 不是区间的倍数,minlength 是必要的,只是为了能够 reshape 形状)

通过从 Erfan 的答案中提取的标签,我们得到:

rnge = range(0, max(a) + interval + 1, interval) 
lables = [f'[{i}-{j})' for i, j in zip(rnge[:-1], rnge[1:])] 
 
for l,b in zip(lables,b): 
    print(l,b) 
 
[0-3) 2 
[3-6) 4 
[6-9) 5 
[9-12) 1 
[12-15) 1 
[15-18) 1 
[18-21) 0 
[21-24) 0 
[24-27) 0 
[27-30) 1 

这比 pandas 解决方案快得多。

性能和缩放比较

为了评估缩放能力,我只是替换了 a = [1, ..., 28] * n 并为 n = 1, 10 计时执行(没有导入和打印) , 100, 1K, 10K 和 100K:

(python 3.7.3 on win32/pandas 0.24.2/numpy 1.16.2)