迭代二维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】:使用zip
和itertools.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列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章