2016-09-05 3 views
0

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

turncycle = [0,1,2,3] 
for turnindex in cycle(turncycle): 
    #. 
    #...turn stuff 
    #...turnindex is used for active player 
    #. 

То, что я хочу сделать, это дан указатель поворота начать мини поворота, где эти событие-карту триггера и они должны что-то. Есть ли способ перестроить список, чтобы я мог изменить [0,1,2,3] на [1,2,3,0] или цикл, начиная с 1,2 или 3, а затем циклически перебирать остальные?

+0

turncycle [1:] + [turncycle [0]] возможно? –

+0

или с помощью * numpy *: 'np.roll (turncycle, 1)' – Anzel

+0

Не уверен, что вы имеете в виду. Примером желаемого поведения было бы хорошо. –

ответ

1

Как насчет этого?

def next_cycle(lst): 
    return turncycle[1:] + turncycle[:1] 

turncycle = [0, 1, 2, 3] 

for turnindex in range(len(turncycle)): 
    turncycle = next_cycle(turncycle) 
    print turncycle 
+1

Imho 'turncycle [1:] + turncycle [: 1]' выглядит намного приятнее и его легко обобщить. –

+0

@StefanPochmann Действительно! Я отредактировал свой ответ – BPL

1

сколотил что-то из itertools recipes

import itertools 
a = [0,1,2,3,4,5,6,7] 
def consume(iterator, n): 
    "Advance the iterator n-steps ahead. If n is none, consume entirely." 
    # Use functions that consume iterators at C speed. 
    if n is None: 
     # feed the entire iterator into a zero-length deque 
     collections.deque(iterator, maxlen=0) 
    else: 
     # advance to the empty slice starting at position n 
     next(itertools.islice(iterator, n, n), None) 

def cycle(turncycle, start = 0): 
    # limit to the original number of turns 
    no_of_turns = len(turncycle) 
    # make a non-ending cycle 
    turncycle = itertools.cycle(turncycle) 
    # advance to the start position 
    consume(turncycle, start) 
    # return a new turn cycle - from the itertools take() recipe 
    return itertools.islice(turncycle, no_of_turns) 

>>> 
>>> for n in cycle(a): 
    print(n), 

0 1 2 3 4 5 6 7 
>>> for n in cycle(a, 4): 
    print(n), 

4 5 6 7 0 1 2 3 
>>> for n in cycle(a, 20): 
    print(n), 

4 5 6 7 0 1 2 3 
>>> 

cycle, возможно, придется быть переделаны немного в зависимости от того, что вы думаете, что параметр start означает.

Возможно, его можно было бы переименовать roll().