2

我正在尝试在 python 中使用 deque 来创建队列。

我不断收到的错误是索引超出范围

perf_his[b][c] = 0

IndexError:双端队列索引超出范围

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

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

为了检查我是否正确理解了双端队列,我实现了以下代码:

#!/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 天内修复该错误,但我似乎不明白这个问题。有人可以阐明一下吗?

4

2 回答 2

2

在您的第一段代码中,您永远不会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)
于 2013-01-27T17:36:37.927 回答
1

设置maxlen后,在添加元素之前,双端队列的大小仍然为零。maxlen=5的效果是,在 5 次 append 之后,next append 会自动弹出最旧的元素,这样大小就永远不会变大。换句话说,maxlen是最大尺寸,而不是最小尺寸。

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

>>> d = deque([0] * 5, maxlen=5)
>>> d[2] = 100
>>> d
deque([0, 0, 100, 0, 0], maxlen=5)
于 2013-01-27T17:56:24.953 回答