【问题标题】:Iterating over a 2 dimensional python list [duplicate]迭代二维python列表[重复]
【发布时间】: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 数组,这不一定会转化为他的问题

标签: python loops multidimensional-array


【解决方案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']

【讨论】:

【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-15
      • 2022-11-25
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2011-12-28
      • 2015-04-04
      相关资源
      最近更新 更多