迭代二维python列表[重复]

Posted

技术标签:

【中文标题】迭代二维python列表[重复]【英文标题】:Iterating over a 2 dimensional python list [duplicate] 【发布时间】:2013-05-09 01:23:35 【问题描述】:

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

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

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

现在给定这个列表,我想按顺序遍历它:

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

即遍历第一列,然后是第二列,依此类推。我如何使用循环来做到这一点?

此问题与纯 python 列表有关,而标记为相同的问题与 numpy 数组有关。它们明显不同

【问题讨论】:

@NominSim 指的是一个 numpy 数组,这不一定会转化为他的问题 【参考方案1】:

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

【讨论】:

但是@Alexey 的回答更好。 为什么 Alexey 的回答更好?这仅使用内置函数,而且似乎并不占用更多资源。 @Z4-tier 这个响应返回一个包含 2 个元组的列表。 Alexey 的回答返回一个包含所有值的列表【参考方案2】:

使用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 用户来说是可以的。使用直接变量名称更新答案。 名称“l”未定义 @Sérgio l 是一个列表...【参考方案3】:
>>> [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 方法,但我想我会抛出一个古怪的替代方案。 这是否只计算一次 len(myList),还是每次迭代都重新计算? @Z4-tier ***.com/questions/1115313/cost-of-len-function【参考方案4】:
>>> 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】:

这是正确的方法。

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

【讨论】:

这不是很pythonic。【参考方案6】:

与您填写的方式相同,但反转索引:

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

【讨论】:

这应该是公认的答案,因为它简单易懂。人们可能不熟悉其他答案中使用的聪明功能,但只需快速浏览一下代码,就很明显该解决方案是如何工作的。因此,这个答案是最 Pythonic 的。 嗯.. 如果每个子列表都没有保存长度(此处为行)怎么办? @sonlexqt 迭代最长行的索引并在打印操作数周围使用try ... except IndexError。 (在我的手机上,所以不能提供确切的例子) 但是如果行数多于列数就不行了。【参考方案7】:

参考:zip built-in function

zip()* 运算符一起可以用于unzip 列表

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

【讨论】:

以上是关于迭代二维python列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

(Python)列表索引超出范围-迭代[重复]

迭代时从Python列表中删除项目[重复]

在python中迭代和更新列表[重复]

几点技巧让你的 python 代码更加 pythonic

迭代Python列表中的每两个元素[重复]

在python中一次迭代列表的两个值[重复]