我有一个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)
