我正在尝试在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天内修复错误,我似乎不明白这个问题。 有人可以请一些亮点吗?
答案 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)