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
This question is related to
python
loops
multidimensional-array
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
>>>
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')]
>>> [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']
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
>>>
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
>>> 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')
Source: Stackoverflow.com