未排序的数字列表在直方图计算中创建不正确的输出

时间:2011-11-16 19:38:56

标签: python histogram

我正在创建一个函数,该列表包含一个请求列表的直方图和请求的值作为直方图的值。高于请求值的值最后包括在内。

程序正在使用按数字升序排序的列表,但是当未排序的列表用作输入时,程序似乎丢弃随机值而不以相同方式计算。 代码:

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]

有什么东西,我只是没有看到这使得数字无法计算?如果可以的话,让我知道我哪里出错了!

1 个答案:

答案 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)
    ...