我正在创建一个函数,该列表包含一个请求列表的直方图和请求的值作为直方图的值。高于请求值的值最后包括在内。
程序正在使用按数字升序排序的列表,但是当未排序的列表用作输入时,程序似乎丢弃随机值而不以相同方式计算。 代码:
def histogram(sample, binBoundaries):
c=0
if not binBoundaries:
li = [len(sample)]
return print(li)
for x in sample:
if x > binBoundaries[-1]: #if the value is greater than last bin
c = c+1 #number of values greater increases
for eachbin in binBoundaries: #for each bin
dic[eachbin] = 0 #initial value = 0 to account for no number
for x in sample: #for each value wanted to calculate for
if x <= eachbin: #if the number falls into the bin
dic[eachbin] += 1 #the number of values in the bin increases
sample.remove(x)
for i in dic:
listofvalues.append(dic[i])
listofvalues.append(c)
print(listofvalues)
直方图([5,4,2,3],[3])
这将导致输出[1,2],其中实际输出应为[2,2]
有什么东西,我只是没有看到这使得数字无法计算?如果可以的话,让我知道我哪里出错了!
答案 0 :(得分:1)
您的问题是您在迭代时从列表sample
中删除项目,这是一个坏主意,因为它会导致跳过某些元素。
尝试取出sample.remove(x)
行,你应该得到预期的结果。如果确实需要从输入列表中删除元素,则应重构以确保仍检查列表中的每个元素。一种选择是使用for x in reversed(sample)
反向迭代列表。
看起来您可能正在删除错误位置的元素,sample.remove(x)
看起来应该位于其正上方的if
内。请尝试以下代码:
...
for eachbin in binBoundaries: #for each bin
dic[eachbin] = 0 #initial value = 0 to account for no number
for x in reversed(sample): #for each value wanted to calculate for
if x <= eachbin: #if the number falls into the bin
dic[eachbin] += 1 #the number of values in the bin increases
sample.remove(x)
...