J'ai créé un tableau à 2 dimensions comme:
rows =3
columns= 2
mylist = [[0 for x in range(columns)] for x in range(rows)]
for i in range(rows):
for j in range(columns):
mylist[i][j] = '%s,%s'%(i,j)
print mylist
L'impression de cette liste donne une sortie:
[ ['0,0', '0,1'], ['1,0', '1,1'], ['2,0', '2,1'] ]
où chaque élément de la liste est une chaîne de format "rangée, colonne"
Maintenant, étant donné cette liste, je veux parcourir cette liste dans l’ordre:
'0,0'
'1,0'
'2,0'
'0,1'
'1,1'
'2,1'
c'est-à-dire parcourir la 1ère colonne puis la 2ème colonne et ainsi de suite. Comment puis-je le faire avec une boucle?
Cette question concerne la liste pure python), tandis que la question portant le même signe concerne les tableaux numpy. Ils sont clairement différents
Utilisez Zip
et itertools.chain
. Quelque chose comme:
>>> from itertools import chain
>>> l = chain.from_iterable(Zip(*l))
<itertools.chain object at 0x104612610>
>>> list(l)
['0,0', '1,0', '2,0', '0,1', '1,1', '2,1']
de la même manière, vous avez rempli, mais inversé les index:
>>> for j in range(columns):
... for i in range(rows):
... print mylist[i][j],
...
0,0 1,0 2,0 0,1 1,1 2,1
>>>
C'est la bonne façon.
>>> x = [ ['0,0', '0,1'], ['1,0', '1,1'], ['2,0', '2,1'] ]
>>> for i in range(len(x)):
for j in range(len(x[i])):
print(x[i][j])
0,0
0,1
1,0
1,1
2,0
2,1
>>>
>>> mylist = [["%s,%s"%(i,j) for j in range(columns)] for i in range(rows)]
>>> mylist
[['0,0', '0,1', '0,2'], ['1,0', '1,1', '1,2'], ['2,0', '2,1', '2,2']]
>>> Zip(*mylist)
[('0,0', '1,0', '2,0'), ('0,1', '1,1', '2,1'), ('0,2', '1,2', '2,2')]
>>> sum(Zip(*mylist),())
('0,0', '1,0', '2,0', '0,1', '1,1', '2,1', '0,2', '1,2', '2,2')
Zip
transposera la liste, après quoi vous pourrez concaténer les sorties.
In [3]: Zip(*[ ['0,0', '0,1'], ['1,0', '1,1'], ['2,0', '2,1'] ])
Out[3]: [('0,0', '1,0', '2,0'), ('0,1', '1,1', '2,1')]
Zip()
en conjonction avec le *
opérateur peut être utilisé pour unzip
une liste
unzip_lst = Zip(*mylist)
for i in unzip_lst:
for j in i:
print j
>>> [el[0] if i < len(mylist) else el[1] for i,el in enumerate(mylist + mylist)]
['0,0', '1,0', '2,0', '0,1', '1,1', '2,1']