2011-09-05 8 views
6

Estoy escribiendo código para analizar un mapa de mapa de azulejos desde un archivo de configuración. El mapa tiene el formato:¿Cómo podría transponer de forma sucinta listas anidadas?

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

donde los números representan las baldosas. I a continuación, hacer esto en una matriz de enteros:

[[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")] 

Esto produce una matriz en el formato [fila] [columna], pero yo preferiría que sea [columna] [fila] como en [x] [ y] así que no tendría que dirigirlo hacia atrás (es decir [y] [x]). Pero no se me ocurre ninguna forma concisa de atacar el problema. He considerado volver a trabajar el formato utilizando la sintaxis xml a través de Tiled, pero parece demasiado difícil para un principiante.

Gracias de antemano por cualquier respuesta.

+0

posible duplicado de [Matriz de transposición en Python] (http://stackoverflow.com/questions/4937491/matrix-transpose-in-python) – ChillarAnand

Respuesta

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 

Cómo funciona: zip(*original) es igual a zip(original[0], original[1], original[2]). que a su vez es igual a: zip ([1, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4, 5]).

+0

Esa es una forma muy eficiente de hacerlo! ¡Gracias! – zzz

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