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

Python 未排序的数字列表在直方图计算中产生不正确的输出,python,histogram,Python,Histogram,我正在制作一个函数,该函数将生成一个列表,其中包括所请求列表的直方图和所请求的值,以用作直方图的值。最后包括高于请求值的值 该程序正在处理一个按数字升序排序的列表,但当一个未排序的列表用作输入时,该程序似乎会丢弃随机值,而不会以相同的方式进行计算。 守则: def histogram(sample, binBoundaries): c=0 if not binBoundaries: li = [len(sample)] return print(l

我正在制作一个函数,该函数将生成一个列表,其中包括所请求列表的直方图和所请求的值,以用作直方图的值。最后包括高于请求值的值

该程序正在处理一个按数字升序排序的列表,但当一个未排序的列表用作输入时,该程序似乎会丢弃随机值,而不会以相同的方式进行计算。 守则:

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)
def直方图(示例、边界):
c=0
如果没有边界:
li=[len(样本)]
返回打印(li)
对于样本中的x:
如果x>bin边界[-1]:#如果该值大于最后一个bin
c=c+1#值的数量增加越多
对于BINbounders中的每个bin:#对于每个bin
dic[eachbin]=0#初始值=0表示无编号
对于样本中的x:#对于要计算的每个值

如果x您的问题是在迭代列表时从列表
sample
中删除项目,这是一个坏主意,因为它会导致跳过某些元素

尝试取出行
示例。删除(x)
,您应该会得到预期的结果。如果确实需要从输入列表中删除元素,则应该重构以确保仍然检查列表中的每个元素。一个选项是使用反向(示例)
中的x的
反向迭代列表

它看起来还可能是您在错误的位置删除元素,
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)
    ...
。。。
对于BINbounders中的每个bin:#对于每个bin
dic[eachbin]=0#初始值=0表示无编号
对于反向(示例)中的x:#对于要计算的每个值

如果x,为什么有返回打印(li)
?根据问题中的描述,这并不能满足您的要求。如果没有Binboundari的输入,返回打印(li)将处理错误。您是否测试过该条件
return print()
不会按照您的想法执行。它会打印li的值。我并不是真的关心这一部分:如果你只想打印值,为什么你有
返回
?我所有的问题都是因为位置问题,非常感谢!现在,在那次更改之后,程序出现了一个问题,即无法正确处理多个数字。但是,随着示例列表的反转,它也解决了这个问题。为什么反转有帮助?@Benjamin-很好地解释了为什么在迭代时删除会导致问题。反转列表会有帮助,因为您将首先删除末尾的元素,这不会影响列表中前面任何元素的索引。我想我也可以通过使用sorted()对列表进行排序来解决此问题。感谢您对F.J.的见解。那篇文章帮助我解决了剩余的作业!