Itération sur une liste de python en 2 dimensions [dupliquer]

cette question a déjà une réponse ici:

j'ai créé un tableau de 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

Impression 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 caractères du format 'ligne, colonne '

maintenant donné cette liste, je veux itérer à travers elle dans l'ordre:

'0,0'
'1,0'
'2,0'
'0,1'
'1,1'
'2,1'

qui est itérate à travers la première colonne puis la deuxième colonne et ainsi de suite. Comment puis-je le faire avec une boucle ?

cette Question se rapporte à purs Python list alors que la question qui est marquée de la même façon se rapporte aux tableaux numpy. Ils sont clairement différents

26
demandé sur Jim G. 2013-05-14 20:49:21

7 réponses

utiliser 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']
18
répondu Alexey Kachayev 2013-05-14 17:02:16

de la même façon que vous avez rempli, mais inversez 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
>>> 
66
répondu Iliyan Bobev 2013-05-14 16:58:12

C'est la bonne voie.

>>> 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
>>> 
38
répondu mrKelley 2016-02-03 00:50:28
>>> 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')
5
répondu Joran Beasley 2013-05-14 16:55:27

zip transposera la liste, après cela 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')]
2
répondu Adrian Ratnapala 2013-05-14 16:52:42

Ref: zip intégré dans la fonction

zip() en conjonction avec l'opérateur * peut être utilisé pour unzip une liste

unzip_lst = zip(*mylist)
for i in unzip_lst:
    for j in i:
        print j
2
répondu Tanky Woo 2013-05-14 17:06:03
>>> [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']
1
répondu dansalmo 2013-05-14 16:55:25