scipy 常见列表索引超出范围问题,为什么?[副本]

ttygqcqt  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(61)

此问题已在此处有答案

Does "IndexError: list index out of range" when trying to access the N'th item mean that my list has less than N items?(7个回答)
2个月前关闭。

import scipy.special

s = [1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3,
     1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6, 1, 2, 1, 3, 1, 2, 1, 4,
     1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3,
     1, 2, 1, 7, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5,
     1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6, 1, 2, 1, 3,
     1, 2, 1, 4, 1]

r = []

for n in range(20):
 result = 1
 for k in range(n-1):
     result += (scipy.special.binom(n - 1, k) % 2) * r[s[n - k - 1]]
 r.append(result)

def binomial_transform(sequence):
    n = len(sequence)
    result = [0] * n
    
    for i in range(n):
        for j in range(i+1):
            result[i] += sequence[j] * scipy.special.binom(i, j)
    
    return result

sequence = r
binomial_result = binomial_transform(sequence)
print(binomial_result)

我试着从结果开始的地方开始,0而不是1,尝试用1作为元素初始化r而不是它是空的,尝试maybe而不是范围n-1中的k,范围n中的k。当列表s是oeis序列A000120时,代码工作得很好,它产生了,正如预期的那样,oeis A101911。现在,我把它从A000120改为A001511,它说列表索引超出范围。我都快疯了。如果我只是在s的前面加上另一个数字,它编译时没有错误,但是如果删除一个元素,就会有错误。

yyhrrdl8

yyhrrdl81#

这个答案只是使几个评论的观察更加明确。
标记的重复项不是特别有用,因为它关注的是索引一个n项长的列表的nth时间的常见情况。这里的问题是使用一个中间索引数组,它可能具有太大的值。
当我运行你的部分代码时,我得到:

In [2]: len(s)
Out[2]: 105
In [3]: r = []
   ...: 
   ...: for n in range(20):
   ...:  result = 1
   ...:  for k in range(n-1):
   ...:      result += (scipy.special.binom(n - 1, k) % 2) * r[s[n - k - 1]]
   ...:  r.append(result)
   ...: 
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[3], line 6
      4 result = 1
      5 for k in range(n-1):
----> 6     result += (scipy.special.binom(n - 1, k) % 2) * r[s[n - k - 1]]
      7 r.append(result)

并且ipython显示器突出显示r[s[n - k - 1]]表达式。
让我们再试一次打印:

In [5]: r = []
   ...: for n in range(20):
   ...:  result = 1
   ...:  for k in range(n-1):
   ...:      print(n,k, len(r), len(s),n-k-1)
   ...:      print(r[s[n - k - 1]])
   ...:      result += (scipy.special.binom(n - 1, k) % 2) * r[s[n - k - 1]]
   ...:  r.append(result)
   ...:  print(n,r)
   ...: 
0 [1]
1 [1, 1]
2 0 2 105 1
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[5], line 6
      4 for k in range(n-1):
      5     print(n,k, len(r), len(s),n-k-1)
----> 6     print(r[s[n - k - 1]])
      7     result += (scipy.special.binom(n - 1, k) % 2) * r[s[n - k - 1]]
      8 r.append(result)

IndexError: list index out of range

所以经过几次循环,n=2r有两项。
n-k-1是2-0-1=1。s[1]2r[2]引发错误。我不知道你为什么选择s的元素作为r的索引。r开始为空,并随着每次追加而增长。但是s的值与r的大小没有任何明显的联系。它们的范围从1到7,似乎是随机的。
r[s[n - k - 1]-1]这样的调整解决了这个n的问题,但是以后的s呢?
尝试一下,它确实运行到n=19,结果是r

19 [1, 1, 2.0, 2.0, 5.0, 2.0, 4.0, 4.0, 10.0, 2.0, 4.0, 4.0, 10.0, 4.0, 8.0, 8.0, 23.0, 2.0, 4.0, 4.0]

同样,这取决于s的值。通过添加-1r索引范围从[0,6]开始。因此,如果6在循环中不是太早,它就会运行。但是在不了解s的情况下,这个补丁看起来就像是一个组装件。

相关问题