Jak osiągnąć linię 9 i 10 I.e dwa for pętle w Pythonie

matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
]

newMatrix = []

for (i=0; i < len(matrix); i++):
    for (j=0; j < len(matrix[i]); j++):
        newMatrix[j][i] = matrix[i][j]
print newMatrix

PS: Wiem, że mogę zrobić [[row[i] for row in matrix] for i in range(4)], ale jak robię tylko do pętli

1
aWebDeveloper 3 wrzesień 2012, 11:51

4 odpowiedzi

Najlepsza odpowiedź

Użyj range (lub xrange).

for i in range(len(matrix)):
  for j in range(len(matrix[i])):

FYI, przypisanie do newMatrix[i][j] nie powiedzie się, ponieważ newMatrix jest pustym list. Musisz dodać nowy pusty list do newMatrix dla każdego wiersza, a następnie dołącz nową wartość do tej listy w każdej iteracji.

2
MAK 3 wrzesień 2012, 07:55

Wystarczy rzucić coś innego do mieszanki odpowiedzi, jeśli robisz dowolne rodzaju operacji matrycy z python, rozważ użycie numpy:

>>> import numpy
>>> matrix = numpy.matrix([
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12]
... ])

Transpozycja jest całkiem prosta do wykonania:

>>> matrix.transpose()
matrix([[ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11],
       [ 4,  8, 12]])
1
Blender 3 wrzesień 2012, 08:12

Możesz użyć enumerate() Funkcja do pętli na obu wartościach macierzy i daj ci wskaźniki:

newMatrix = [[0] * len(matrix) for _ in xrange(len(matrix[0]))]
for i, row in enumerate(matrix):
    for j, value in enumerate(row):
        newMatrix[j][i] = value

To daje:

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

Ponieważ adresujesz wiersze i kolumny bezpośrednio w nowej matrycy, musisz najpierw zainicjować nową matrycę z pustymi wartościami. Rozumienie listy w pierwszym wierszu mojego przykładu robi to dla Ciebie. Tworzy nową matrycę, która jest ( y , w rozmiarze, biorąc pod uwagę matrycę wejściową o rozmiarze ( x , y ).

Alternatywnie, można uniknąć wyraźnego zapętlenia (AB) przy użyciu zip Funkcja :

newMatrix = zip(*matrix)

Który bierze każdy wiersz matrix i grupuje każdą kolumnę w tych wierszach na nowe wiersze.

W przypadku ogólnego, Python {X0}} konstruuje pętlę nad sekwencjami. range() i

Martijn Pieters 3 wrzesień 2012, 08:11

Jeśli dobrze cię rozumiem, to, co chcesz zrobić, to a Transpozycja macierzy, którą można to zrobić droga:

 zip(*matrix)
1
georg 3 wrzesień 2012, 08:14