迭代遍历一个二维Python列表

71

我创建了一个二维数组,例如:

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

打印此列表将输出:

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

其中每个列表项都是格式为'行,列'的字符串。

现在,给定这个列表,我想按照以下顺序进行迭代:

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

如何使用循环迭代遍历第一列,然后是第二列,以此类推?

这个问题涉及纯Python列表,而标记为相同的问题涉及NumPy数组。它们明显不同。


7
@NominSim指的是一个NumPy数组,但这并不一定适用于他的问题。 - Ivo Flipse
7个回答

138

以与填充相同的方式进行,但反转索引:

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

24
这个答案应该被接受,因为它简单易懂。也许有些人对其他答案中使用的巧妙函数不熟悉,但是只需快速查看代码,就可以明白这个解决方案是如何工作的。正因为如此,这个答案是最符合Python风格的。 - Mr. Lance E Sloan
2
嗯...如果每个子列表的长度(这里是行数)不相同怎么办? - sonlexqt
@sonlexqt 迭代最长行的索引并在打印操作数周围使用 try ... except IndexError。 (由于我在手机上,无法提供确切的示例) - Iliyan Bobev
但是如果行数大于列数,这种方法就不起作用了。 - TamingofTheShru

104

这是正确的方式。

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

5
这不是很符合 Python 的编程风格。 - nelsontruran

38

使用 zipitertools.chain。可以这样做:

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

@AndyHayden 实际上,对于活跃的交互式 shell 用户来说这没问题。已更新答案,直接使用变量名。 - Alexey Kachayev
2
名称“l”未定义。 - Sérgio
1
@Sérgio l 是一个列表... - user4396006

7
>>> 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')

4

zip函数会对列表进行转置,之后您可以将输出连接起来。

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
但是@Alexey的答案更好。 - Adrian Ratnapala
为什么Alexey的答案更好? 它仅使用内置函数,并且似乎没有更多的资源需求。 - Z4-tier
@Z4-tier 这个响应返回了一个包含2个元组的列表。Alexey的答案返回了一个包含所有值的单个列表。 - Vincent LE GARREC

3

参考:zip内置函数

zip() 带着 * 运算符可以用来 解压缩 一个列表

unzip_lst = zip(*mylist)
for i in unzip_lst:
    for j in i:
        print j

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

我更喜欢zip方法,但我想提出一个古怪的替代方案。 - dansalmo
这个代码会只计算一次 len(myList),还是每次迭代都会重新计算一遍? - Z4-tier
@Z4-tier https://dev59.com/G3NA5IYBdhLWcg3wC5NR@Z4层 https://dev59.com/G3NA5IYBdhLWcg3wC5NR - dansalmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接