Quello che state facendo può essere facilmente fatto in una singola linea utilizzando reversed
e zip
. Problema effettivo nel codice fornito di seguito in questa risposta.
Esempio -
list(zip(*reversed(yourlist)))
Non è necessario il list(...)
per Python 2.x, come zip()
restituisce una lista in Python 2.x.
Demo -
>>> list(zip(*reversed([[1,2,3], [4,5,6], [7,8,9]])))
[(7, 4, 1), (8, 5, 2), (9, 6, 3)]
>>> list(zip(*reversed([[1,2,3,4], [5,6,7,8], [9,10,11,12]])))
[(9, 5, 1), (10, 6, 2), (11, 7, 3), (12, 8, 4)]
Se si desidera una lista di liste, invece di lista di tuple, è possibile utilizzare di lista (o map(list, zip(*reversed(....)))
). Esempio -
[list(x) for x in zip(*reversed(yourlist))]
Demo -
>>> [list(x) for x in zip(*reversed([[1,2,3], [4,5,6], [7,8,9]]))]
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
>>> [list(x) for x in zip(*reversed([[1,2,3,4], [5,6,7,8], [9,10,11,12]]))]
[[9, 5, 1], [10, 6, 2], [11, 7, 3], [12, 8, 4]]
*
è la sintassi per la decompressione, quindi la lista restituita da reversed()
viene decompresso in zip()
e passato come argomenti separati ad esso.
Quindi la funzione zip()
combina gli elementi di ciascun argomento nel suo indice corrispondente (come tutti i primi argomenti insieme, tutti i secondi argomenti insieme, ecc.), Quindi otteniamo il risultato di cui abbiamo bisogno.
Il problema effettivo per il codice originale si è verificato a causa della seguente riga -
for i in (range(len(list1)+1)):
Stai loop fino len(list1) + 1
, da qui alla fine si tenta di accedere a elementi come list1[0][len(list1)]
, ma che non esiste in il tuo caso.
Supponendo che il sottolista di list1
abbia la stessa quantità di elementi, ciò di cui si ha realmente bisogno sarà len(list1[0])
.Esempio -
def rotate(list1):
bigList = [] #create a list that we will append on to
for i in (range(len(list1[0]))): #loop through the list looking at the indexes
newList = []
for j in reversed(range(len(list1))): #reverse that list
newList.append(list1[j][i])
bigList.append((newList)) #append the elements to the bigList reversed
return bigList
Demo -
>>> def rotate(list1):
... bigList = [] #create a list that we will append on to
... for i in (range(len(list1[0]))): #loop through the list looking at the indexes
... newList = []
... for j in reversed(range(len(list1))): #reverse that list
... newList.append(list1[j][i])
... bigList.append((newList)) #append the elements to the bigList reversed
... return bigList
...
>>> rotate([[1,2,3], [4,5,6], [7,8,9]])
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
>>> rotate([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
[[9, 5, 1], [10, 6, 2], [11, 7, 3], [12, 8, 4]]
Il vostro rientro postato qui è corretto? –
@AnandSKumar Non penso che lo sia, e anche la sua lista non è giusta. – Leb
@AnandSKumar Dovrebbe essere corretto ora, mi dispiace per il fatto che mi sto ancora abituando ai blocchi di codice mentre lo digito in –