2011-09-05 25 views
6

Sto scrivendo il codice per analizzare una mappa tilemap da un file di configurazione. La mappa è nel formato:Come traspondere succintamente gli elenchi annidati?

1|2|3|4 
1|2|3|4 
2|3|4|5 

dove i numeri rappresentano le tessere. Ho poi fare questo in una matrice intera:

[[int(tile) for tile in row.split("|")] for row in "1|2|3|4\n1|2|3|4\n2|3|4|5".lstrip("\n").split("\n")] 

Questo produce un array nel formato [riga] [colonna], ma preferirei che fosse [colonna] [riga] come in [x] [ y] quindi non avrei dovuto richiamarlo indietro (cioè [y] [x]). Ma non riesco a pensare ad alcun modo conciso per attaccare il problema. Ho pensato di rielaborare il formato usando la sintassi xml tramite Tiled, ma sembra troppo difficile per un principiante.

Grazie in anticipo per eventuali risposte.

+0

possibile duplicato del [Matrix trasposizione in Python] (http://stackoverflow.com/questions/4937491/matrix-transpose-in-python) – ChillarAnand

risposta

26

uso mylist = zip(*mylist):

>>> original = [[1, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4, 5]] 
>>> transposed = zip(*original) 
>>> transposed 
    [(1, 1, 2), (2, 2, 3), (3, 3, 4), (4, 4, 5)] 

>>> original[2][3] 
    5 

>>> transposed[3][2] 
    5 

Come funziona: zip(*original) è pari a zip(original[0], original[1], original[2]). che a sua volta è uguale a: zip ([1, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4, 5]).

+0

Questo è un modo incredibilmente efficace di farlo! Grazie! – zzz

0
def listTranspose(x): 
    """ Interpret list of lists as a matrix and transpose """ 
    tups = zip(*x) 
    return [ list(t) for t in tups ] 
Problemi correlati