2015-10-05 2 views
3

Я решаю проблему программирования, где мне нужно запустить в любом заданном положении в массиве/списке и повторить до тех пор, пока я не удалю исходную позицию. Я думал о круговом буфере, вроде подхода (dequeue), но я не уверен, есть ли итерационный метод, который делает это.Циркулярный итератор в Python

Дано:

[1,10,20] 

Так что, когда я начинаю переборе в положении: 1 я хочу выходной итерация быть:

10, 20, 1

Мой текущий раствор:

startPosition = 1 
data = [1,10,20] 
for i in range(0, 3): 
    pos = (startPosition+i)%3 
    print data[pos] 

Есть ли другие элегантные решения? Или контейнер делает это?

Исследование:

я наткнулся на цикл от itertools, но это бесконечный loop.I придется использовать следующий метод, чтобы получить и остановку в правильном положении. Circular list iterator in Python

+2

вы можете использовать 'data [startPosition:] + data [: startPosition]' вместо –

ответ

4

Как вы упомянули вы можете использовать Deque, который случается быть в стандартной библиотеке:

from collections import deque 

startPosition = 1 
data = [1,10,20] 

d = deque(data) 
d.rotate(-startPosition) 

Вы должны отрицать направление rotate, потому что по умолчанию он делает поворот вправо.

1

Так элегантно в программировании немного субъективно. Ваш код легко читать/понимать и наиболее эффективный способ решения данной проблемы. Есть, конечно, способы написания кода в меньшем количестве байтов, но они могут быть не такими разборчивыми, как ваши, поэтому я бы не назвал их более элегантными. И если вы ищете более быстрый способ решения поставленной задачи, вы уже достигли наилучшей возможной сложности O (n).

Смежные вопросы