# Iterating over a 2 dimensional python list [duplicate]

Posted on

### Question :

Iterating over a 2 dimensional python list [duplicate]

I have created a 2 dimension array like:

``````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
``````

Printing this list gives an output:

``````[  ['0,0', '0,1'], ['1,0', '1,1'], ['2,0', '2,1']   ]
``````

where each list item is a string of the format ‘row,column’

Now given this list, i want to iterate through it in the order:

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

that is iterate through 1st column then 2nd column and so on. How do i do it with a loop ?

This Question pertains to pure python list while the question which is marked as same pertains to numpy arrays. They are clearly different

Use `zip` and `itertools.chain`. Something like:

``````>>> 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']
``````

same way you did the fill in, but reverse the indexes:

``````>>> 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
>>>
``````

This is the correct way.

``````>>> 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` will transpose the list, after that you can concatenate the outputs.

``````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()` in conjunction with the `*` operator can be used to `unzip` a list

``````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)]