python 3.6.3未声明长度列表的索引错误

时间:2018-01-30 20:35:43

标签: python syntax-error

所以我正在构建一个程序来从给定的值列表生成直方图,主数字运算位如下所示:

x=[] #declare x list(unnecessary?)
i=0 #declare i (unnecessary?)
for i in range(0, len(data)):
    comp = data[i] #grab 'i'th data value
    for j in range(0, bins): #determine which bin data point belongs
        lorng=lo+(j*binwidth)
        hirng=lo+((j+1)*binwidth)
        if comp==lo:
            x[0]+=1 #increment lowest value bin for lowest value data
        if comp > lorng and comp <= hirng: 
            x[j]+=1 #increment bin for data in a given range
print(x)

不幸的是我在x[0]+=1上获得了超出范围错误的列表索引。我需要声明列表长度吗?从其他线索来看,我似乎不需要这样做。

修改:我已将x[]更改为x=np.zeroes(shape=(1,bins),但现在它在i=0上抛出了无效的语法错误,因此无法检查

2 个答案:

答案 0 :(得分:2)

x是一个空列表,不支持任何类型的索引。这就是x[0]+=1给出错误的原因。

由于您可以使用numpy,因此可以使用histogram获得相同的效果。

import numpy as np

values = np.random.randint(0, 101, 1000)
hist = np.histogram(values, bins=10)
print(hist)

这将创建一个包含0到100之间的1000个随机数的列表,然后将它们分成10个bin。如果你想在纯python中这样做,你必须事先用正确的索引数量初始化你的列表:x = [0 for i in range(num_bins)](或类似的)。

在代码评论中解决您的问题:

  1. 是的,根据您的方法,您需要先定义x(如上所述)。
  2. 不,没有必要声明ifor i in range(0, len(data)):会照顾到这一点。
  3. 编辑:

    刚刚注意到我在编写这个答案时所做的编辑:

    1. SyntaxError上的i = 0实际上是由以前的行引起的:x=np.zeroes(shape=(1,bins)错过了关闭的parens。
    2. 您不希望shape=(1, bins)因为那会给您一个2D数组。如果您想以这种方式初始化x,请使用x = np.zeros(bins)而不是我的python方法。

答案 1 :(得分:0)

您的列表一开始没有任何内容。因此,您需要对其进行zerofill以按索引访问所有元素,而无需显式插入它们。

x=[0] * bins

for i in range(0, len(data)):
    comp = data[i]
    for j in range(0, bins):
        lorng=lo+(j*binwidth)
        hirng=lo+((j+1)*binwidth)
        if comp==lo:
            x[0]+=1 #increment lowest value bin for lowest value data
        if comp > lorng and comp <= hirng: 
            x[j]+=1 #increment bin for data in a given range
print(x)

值得注意的是x = [0] * bins使用x零初始化列表bins