2

Python で deque を使用してキューを作成しようとしています。

私が取得し続けるエラーは、インデックスが範囲外です

perf_his[b][c] = 0

IndexError: deque インデックスが範囲外です

これは、私が実装したコードの小さなプロトタイプです。

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日ほどでエラーを修正しようとしてきましたが、問題を理解していないようです. 誰かが光を当てることができますか?

4

2 に答える 2

2

コードの最初のビットでは、 にアクセスすることはありません。したがって、要素「0」は決してないため、append()それに割り当てることはできません。設定は要素を作成しません。後で存在できる要素の数を制限するだけです。dequemaxlen

おそらく代わりにこれが必要です:

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が設定されている場合、要素が追加されるまで両端キューはサイズ 0 のままです。maxlen=5の効果は、5 回の追加後、次の追加で最も古い要素が自動的にポップされるため、サイズが大きくなることはありません。つまり、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 に答える