Listado de elementos en listas anidadas en diagonal

este es mi primer post, soy bastante nuevo este sitio impresionante.

Me gustaría listar todos los elementos en una matriz de 3×3 en diagonal:

L = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] 

Rendimiento esperado:

 [[7], [4, 8], [1, 5, 9], [2, 6], [3]] 

Además, ¿cómo lo generalizaría a cualquier matriz N x N?

Edición: Me he dado cuenta de que esto me ha preguntado anteriormente, pero estoy buscando una forma sin importar números o cualquier biblioteca.

Edit2: Uno de mis compañeros de clase ofreció esta solución, la que más me gusta:

Ya que encuentra diagonales a partir de la esquina inferior izquierda, puede hacer esto comenzando en la esquina superior derecha del cuadrado e invirtiendo su solución al final. Mi enfoque fue primero revertir cada fila en L, y luego agregar cada elemento a su correspondiente lista diagonal. La idea aquí es que comienza a agregar elementos en cada fila K, no en la primera sub-lista de la lista final, sino en el índice K. Por ejemplo, después de revertir la fila [4,5,6] a la fila [6,5, 4], agregaría 6 a la segunda lista secundaria de mi lista ordenada en diagonal (ya que esta es la segunda fila), luego agregaría 5 a la tercera lista secundaria, y luego agregaría 4 a la cuarta lista secundaria. Sin embargo, si no tuviera una cuarta sub-lista en este momento en mi lista diagonal, agregaría una cuarta lista vacía y luego la llenaría con 4.

Mi explicación puede no ser demasiado clara, así que aquí está el código que tengo.

 def diagonal(l): L = l[:] return_list = [[] for i in range(len(L))] for line in range(len(L)): L[line].reverse() i = line for elem in L[line]: if i >= len(return_list): return_list.append([]) return_list[i].append(elem) i += 1 return_list.reverse() return return_list 

Usando solo Python (no NumPy):

 import itertools as IT L = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] N = len(L) d = dict() for i,j in IT.product(range(N), repeat=2): d.setdefault(ji, []).append((i,j)) print([[L[i][j] for i,j in d[k]] for k in range(-N+1, N)]) # [[7], [4, 8], [1, 5, 9], [2, 6], [3]] 

O, aún mejor, use la transformación de Nemo (generalizada a matrices con forma de hxw

 L = [ [1, 2, 3,], [4, 5, 6,], [7, 8, 9,], ] h, w = len(L), len(L[0]) print([[L[h-1-q][pq] for q in range(min(p, h-1), max(0, p-w+1)-1, -1)] for p in range(h+w-1)]) # [[7], [4, 8], [1, 5, 9], [2, 6], [3]] 

También podemos poner este código en una función para facilitar su uso:

 def diagonals(L): """ https://stackoverflow.com/a/31373955/190597 (unutbu) >>> L = array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]]) >>> diagonals(L) [[9], [6, 10], [3, 7, 11], [0, 4, 8], [1, 5], [2]] """ h, w = len(L), len(L[0]) return [[L[h - p + q - 1][q] for q in range(max(p-h+1, 0), min(p+1, w))] for p in range(h + w - 1)] def antidiagonals(L): """ >>> L = array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]]) >>> antidiagonals(L) [[0], [3, 1], [6, 4, 2], [9, 7, 5], [10, 8], [11]] """ h, w = len(L), len(L[0]) return [[L[p - q][q] for q in range(max(p-h+1,0), min(p+1, w))] for p in range(h + w - 1)]