我正在研究Think Python,并且有一个练习,您将编写一个执行以下操作的函数:
- 作为参数:(
L
数字列表)和n
(和 int) n
以子列表 列表的形式返回直方图- 每个子列表表示 中的数字所涵盖范围的细分,并包含一个 int 表示该细分中有
L
多少个元素L
- 每个子列表表示 中的数字所涵盖范围的细分,并包含一个 int 表示该细分中有
所以我们正在查看一系列数字,将该范围分成n
相等的桶,并用这些桶构建直方图。本练习之前的部分展示了在处理区间 [0.0, 1.0) 中的随机浮点数列表时如何构建这样的函数。它查看元素在该区间中的位置(这只是它的值),将其乘以n
,然后转换为 int (在过程中截断)。这会在 [0, n) 中产生一个 int,它是合适的桶索引。
这里的区别在于我们不是在预定的(和方便的)间隔内工作。这就是我想出的。我想知道是否有更优雅的方式来做到这一点。我将我的区间计算为max(L) - min(L)
,但必须添加一些额外的,否则 in 中的最大元素L
将获得 n 的索引(超出范围),而它应该得到 n - 1。我调用了 little extra extraBit
。
def histogram(L, n):
hist = [0] * numBuckets
minVal = min(L)
maxVal = max(L)
extraBit = .0000000000001
interval = (maxVal - minVal) + extraBit
for i in L:
placement = (i - minVal) / interval
index = int(placement * numBuckets)
hist[index] = hist[index] + 1
return hist
有没有更漂亮的方法来做到这一点?