2015-12-15 7 views
6

Sto cercando di capire come stampare il seguente elenco senza iniziare dal primo elemento. Per essere chiari: se la lista è [0,1,2,3,4,5,6,7,8], voglio stampare qualcosa come 4,5,6,7,8,0,1,2,3Come stampare un intero elenco mentre non si avvia dal primo elemento

Ecco il codice:

you_can_move_on = False 

List = [0,1,2,3,4,5,6,7,8] 

next_player = 3 

while not you_can_move_on: 
    next_player = self.get_next_player_index(next_player) 
    you_can_move_on = self.check_if_I_can_move_on 
    print(next_player) 


def get_next_player_index(self, i): 
    if i == len(self.players): 
     return 0 
    else: 
     return i+1 

def check_if_I_can_move_on(self): 
    return False 
+0

Quali problemi/errori si stanno verificando con il codice pubblicato? – moveaway00

risposta

9

penso che dovrebbe essere

print(l[3:] + l[:3]) 
+0

"next_player = 3" non sarà sempre 3. Riceverò un errore "indice elenco fuori intervallo". Penso che il problema risieda nella funzione get_next_player_index. – RageAgainstheMachine

4

Se si desidera ruotare il i giocatori utilizzano un ciclo deque:

from collections import deque 

d = deque([0,1,2,3,4,5,6,7,8]) 

d.rotate(len(d)//2 + 1) 

print(d) 
deque([4, 5, 6, 7, 8, 0, 1, 2, 3]) 

Se si voleva tenere traccia di ogni giocatore si può solo continuare a rotazione:

from collections import deque 

d = deque([0,1,2,3,4,5,6,7,8]) 

print(d) 
next_p = d[0] 
print(next_p) 
d.rotate() 
print(d) 
next_p = d[0] 
print(next_p) 

uscita:

deque([0, 1, 2, 3, 4, 5, 6, 7, 8]) 
0 
deque([8, 0, 1, 2, 3, 4, 5, 6, 7]) 
8 

È possibile spostare la logica all'interno di una funzione get_next_player, basta fare self.players un deque, questo verrà riavviato automaticamente dopo che tutti i giocatori hanno avuto un andare a partire da un giocatore diverso ogni giro:

def get_next_player(self): 
    if self.players[0] is None: 
     self.players.popleft() 
     self.players.rotate(-1) 
     self.players.appendleft(None) 
    else: 
     n_p = self.players[0] 
     self.players.rotate() 
    return n_p 

la funzione si occupa delle rotazioni, è possibile vedere il l ogic below:

# sim round 
In [25]: print([get_next_player() for _ in range(10)]) 
[1, 0, 8, 7, 6, 5, 4, 3, 2, 1] 

In [26]: players 
# now next player starts 
Out[26]: deque([None, 1, 2, 3, 4, 5, 6, 7, 8, 0]) 
# sim round 
In [27]: print([get_next_player() for _ in range(10)]) 
[2, 1, 0, 8, 7, 6, 5, 4, 3, 2] 

In [28]: players 
Out[28]: deque([None, 2, 3, 4, 5, 6, 7, 8, 0, 1]) 
# next player starts 
In [29]: print([get_next_player() for _ in range(10)]) 
[3, 2, 1, 0, 8, 7, 6, 5, 4, 3] 

In [30]: players 
Out[30]: deque([None, 3, 4, 5, 6, 7, 8, 0, 1, 2]) 
+0

Ricevo ancora l'errore "indice elenco fuori intervallo". Ho implementato in questo modo, si può individuare un problema ?: \t def get_next_player_index (self, i): \t \t se i == len (self.players): \t \t \t n_P = self.players [i] \t \t \t self.players.rotate() \t \t \t ritorno n_P \t \t altro: \t \t \t ritorno i + 1 – RageAgainstheMachine

+0

@RageAgainstheMachine, è non c'è bisogno di inde x qualsiasi cosa, i tuoi giocatori non stanno andando in sequenza? Inoltre non è possibile ottenere un errore di lista usando un deque –

+0

è un gioco di poker, i giocatori stanno andando "in ordine" ma ogni turno c'è un nuovo "primo giocatore" – RageAgainstheMachine