collections-deque中的错误 - Python

时间:2013-01-27 17:33:56

标签: python deque

我正在尝试在python中使用deque的队列。

我不断得到的错误是指数超出范围

perf_his[b][c] = 0

IndexError:deque index超出范围

这是我实现的代码的一个小原型。

import collections

apps = [1,2,3]
num_thrs = len(apps)
perf_his = []
for a in range(num_thrs):
 perf_his += [collections.deque(maxlen=1)]

for b in range(num_thrs):
 for c in range(0, 1):
  perf_his[b][c] = 0

为了检查我是否正确理解了deque,我实现了这段代码:

#!/usr/bin/env python

from collections import deque

something = ["foo","bar","baz"]
output = []
diff = 0

d = deque()

for i in something:
    d.append(i)
    print("-> %s" % i)

for i in xrange(len(d)):
    print(d[i])
    output.append(d[i])

for i in xrange(len(something)):
    if output[i] != something[i]:
        diff += 1

print(something,output,diff)

我一直试图在2天内修复错误,我似乎不明白这个问题。 有人可以请一些亮点吗?

2 个答案:

答案 0 :(得分:1)

在您的第一段代码中,您永远不会append()deque,因此它永远不会拥有元素“0”,因此您不被允许分配给它。设置maxlen不会创建元素,它只会限制以后可以显示的元素数量。

你可能想要的是:

for a in range(num_thrs):
  perf_his += [collections.deque()]

for b in range(num_thrs):
  for c in range(0, 1):
    perf_his[b].append(0)

答案 1 :(得分:1)

设置 maxlen 时,deque仍为大小为零,直到添加元素为止。 maxlen = 5 的效果是在五次追加之后,然后下一个追加将自动弹出最旧的元素,以便大小永远不会变大。换句话说, maxlen 是最大尺寸,而不是最小尺寸。

对于您的应用程序,deque需要预先填充初始值,然后才能进行任何分配:

>>> d = deque([0] * 5, maxlen=5)
>>> d[2] = 100
>>> d
deque([0, 0, 100, 0, 0], maxlen=5)