2015-11-25 13 views
-2

Я хотел бы перебирать циклически по списку (или любой другой итерацию по этому вопросу), и я знаю, что вы можете сделать это с помощью функции cycle из itertools (как показано here), но эта функция работает бесконечно. Мне было интересно, есть ли разумный способ сделать это только один раз (и без использования оператора modulo).итерация «циклически» над итератора только один раз

Я имею в виду, что я хотел бы перебирать итерируемый таким образом, чтобы последний элемент был первым. Поэтому я хотел бы начать итерацию и прекратить всякий раз, когда итератор достигнет начала итерации.

Нечто подобное, но менее уродливым:

points = [1, 2, 3, 4, 5] 
start = points[0] 
iterator = cycle(points) 

p = next(iterator) 
while True: 
    print(p) 
    p = next(iterator) 
    if p == start: 
     print("quitting at", p) 
     break 
+0

один раз, вы имеете в виду одну копию? –

+0

Можете ли вы привести пример? Если 'foo' реализует то, что вам нужно, каков будет выход' for x в foo ([1,2,3]): print (x) '? – arekolek

+0

См. Обновленный вопрос. – aaragon

ответ

0

Почему вы не цепь или сростить итерацию?

a = [1,2,3] 

for x in a + a: 
    print x 

from itertools import chain, tee 
for x in chain(tee(a, 2)): 
    print x 

Это кажется достаточно

+0

Это будет работать, только если итерация поддерживает повторение его более одного раза. В противном случае, когда «цепочка» переходит к повторению по ней во второй раз, истребитель будет потреблен. _Fix_ должен использовать 'itertools.tee'. – mgilson

+0

@mgilson Я только что отредактировал ответ на 'tee'. – Ale

1

просто уверен, но с chain и repeat (для sequences) или tee (для iterators):

>>> from itertools import chain, repeat, tee 
>>> print(*chain(*repeat([1, 2, 3], 2))) 
1 2 3 1 2 3 

>>> print(*chain(*tee(i for i in [1,2,3]))) 
1 2 3 1 2 3 

Звездочка используется для unpack argument lists.

Answer by Ale (цепь без повтора) еще лучше, если итерабельность уже назначена переменной, и вам нужно фактически два цикла, в отличие от восьми, или любое другое конечное число.

Update

код, эквивалентный в обновленном вопрос:

points = [1, 2, 3, 4, 5] 
for x in points: 
    print(x) 
print("quitting at", points[0]) 

Который в основном эквивалентна the original answer by Tomás Glaría.

+0

Ну, он сказал, что ему нужно было только один цикл ;-) – Ale

+0

Как это эквивалентно? Критерий разрыва цикла заключается в том, что вы сталкиваетесь с первым узлом после циклического повторения итерации. – aaragon

+0

@aaragon Это эквивалентно в том смысле, что выход (побочный эффект) тот же. Вы не можете жаловаться, что среднее значение для достижения вашей цели отличается, так как лучшее среднее - это то, о чем вы просите. Вместо этого вы должны уточнить свой вопрос, чтобы показать, что for-loop не является достаточным решением (если это так). – arekolek

1

Не могли бы вы объяснить, что вы просите немного лучше. Что вы подразумеваете под cycle и only once?

Разве это не только for item in list: do someting with item?

EDIT: что я понял о проблеме, было то, что вы хотите перебирать все элементы, начиная с любого индекса. Если да, то:

lista = range(10) 
idx = 5 
for item in lista[idx:]+lista[:idx]: 
    print item 

Другой Edit: ¿я понял вопрос правильно? Если то, о чем вы спрашиваете, останавливается в первом элементе, то вы просто итерации на итераторе для остальных элементов (и, возможно, затем перестройте итератор?).

points = [1,3,5,7,9] 
iterator = iter(points) 

iterator.next()  #Let's remove a couple of items 
iterator.next()  #Let's remove a couple of items 

for item in iterator: 
    print(item) 

iterator = iter(points) 
+2

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10338011) – Siyual

+0

Я не мог комментировать эту запись, но теперь могу. – tglaria

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

  • Нет связанных вопросов^_^