Я пытаюсь получить очередь, используя deque в Python.

Ошибка, которую я продолжаю получать - это индекс вне диапазона

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 дня, кажется, я не понимаю проблему. Может кто-нибудь, пожалуйста, пролить свет?

2
pistal 27 Янв 2013 в 21:33

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)
1
Amber 27 Янв 2013 в 17:36

Когда установлено значение maxlen , раздел остается равным нулю, пока элементы не будут добавлены. Эффект maxlen = 5 заключается в том, что после пяти добавлений следующее добавление автоматически выталкивает самый старый элемент, так что размер никогда не увеличивается. Другими словами, maxlen - это максимальный размер, а не минимальный.

Для вашего приложения необходимо предварительно заполнить deque начальными значениями, прежде чем вы сможете делать какие-либо назначения:

>>> d = deque([0] * 5, maxlen=5)
>>> d[2] = 100
>>> d
deque([0, 0, 100, 0, 0], maxlen=5)
1
Raymond Hettinger 27 Янв 2013 в 17:56