Python:检索列表值内的列表值的长度

时间:2018-11-14 08:28:24

标签: python

我最近选择了Python,我在这本tutorial和一本叫做Automate The Boring Stuff With Python的书之间进行了交替。

我觉得这本书很容易理解,而且练习很有趣。 我特别解决了一个问题,但老实说,我对自己的回答不满意。

在问题中,一个人的网格如下:

grid = [['.', '.', '.', '.', '.', '.'],
        ['.', '0', '0', '.', '.', '.'],
        ['0', '0', '0', '0', '.', '.'],
        ['0', '0', '0', '0', '0', '.'],
        ['.', '0', '0', '0', '0', '0'],
        ['0', '0', '0', '0', '0', '.'],
        ['0', '0', '0', '0', '.', '.'],
        ['.', '0', '0', '.', '.', '.'],
        ['.', '.', '.', '.', '.', '.']]

仅使用循环,然后需要一个以产生以下输出:

..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....

我针对该问题的解决方案(有效)如下:

for y in range(0,len(grid[0])):
    for x in range(0, len(grid)):
        print(grid[x][y], end='')

    print()

我的问题是网格[0] 。我已尝试对代码进行概括,以适应网格中的列表具有不同值但失败的情况。

因此,我的问题是,如何用一般变量术语检索 grid [0] len

换句话说,如何获取列表中列表的长度?

5 个答案:

答案 0 :(得分:2)

例如,考虑所有内容列表的长处:

>>> grid = [['.', '.', '.', '.', '.', '.'],
...         ['.', '0', '0', '.', '.', '.'],
...         ['0', '0', '0', '0', '.', '.'],
...         ['0', '0', '0', '0', '0', '.'],
...         ['.', '0', '0', '0', '0', '0'],
...         ['0', '0', '0', '0', '0', '.'],
...         ['0', '0', '0', '0', '.', '.'],
...         ['.', '0', '0', '.', '.', '.'],
...         ['.', '.', '.', '.', '.', '.']]
>>> 
>>> max(map(len, grid))
6

顺便说一句,一种解决该问题(无循环)的Python方法如下list(zip(*grid))

>>> for l in zip(*grid):
...     print("".join(l))
... 
..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....

答案 1 :(得分:2)

您实际上不需要检索长度。

您可以在一行中完成,而无需知道尺寸:

print('\n'.join(map(lambda x: ''.join(x), zip(*grid))))

逐步:

  1. zip(*grid)将转置2维数组
>>> list(zip(*grid))
[('.', '.', '0', '0', '.', '0', '0', '.', '.'),
 ('.', '0', '0', '0', '0', '0', '0', '0', '.'),
 ('.', '0', '0', '0', '0', '0', '0', '0', '.'),
 ('.', '.', '0', '0', '0', '0', '0', '.', '.'),
 ('.', '.', '.', '0', '0', '0', '.', '.', '.'),
 ('.', '.', '.', '.', '0', '.', '.', '.', '.')]
  1. map(lambda x: ''.join(x), zip(*grid))将加入每一行
>>> list(map(lambda x: ''.join(x), zip(*grid)))
['..00.00..', '.0000000.', '.0000000.', '..00000..', '...000...', '....0....']
  1. 最后,'\n'.join与分隔符作为新行加入
>>> print('\n'.join(map(lambda x: ''.join(x), zip(*grid))))
..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....

注意:我们也可以通过printsep='\n来省略第三步,但是在Python3中: Why does map return a map object instead of a list in Python 3?,我们需要在打印之前将其转换为list。像这样:

print(list(map(lambda x: ''.join(x), zip(*grid))), sep='\n')

答案 2 :(得分:1)

另一种方法是从转置网格开始,然后循环遍历每一行的元素

 grid = [['.', '.', '.', '.', '.', '.'],
         ['.', '0', '0', '.', '.', '.'],
         ['0', '0', '0', '0', '.', '.'],
         ['0', '0', '0', '0', '0', '.'],
         ['.', '0', '0', '0', '0', '0'],
         ['0', '0', '0', '0', '0', '.'],
         ['0', '0', '0', '0', '.', '.'],
         ['.', '0', '0', '.', '.', '.'],
         ['.', '.', '.', '.', '.', '.']]
  grid2=zip(*grid)
 # print(grid2)
  for row in grid2:
     for el in row:
         print(el, end='')
     print('\n')

答案 3 :(得分:1)

如果查看所需的输出,您会发现final矩阵是给定列表的transpose

使用transpose 转置函数可以找到矩阵的numpy

您可以将列表理解join方法结合使用,以实现所需的目标。

import numpy as np
transpose = np.array(grid).transpose()
print('\n'.join([''.join(row) for row in transpose]))

输出

..00.00..
.0000000.
.0000000.
..00000..
...000...
....0....

答案 4 :(得分:1)

如果您确实必须获得列表中列表的长度,只需使用len(grid[index])

for i in range(len(grid)):
    for j in range(len(grid[i])):
        print(mylist[i][j], end='')
    print()

但是,遍历列表的元素比获取列表的索引要容易。例如,代替上面的解决方案,请使用

for row in mylist:
    for element in row:
         print(element, end='')
    print()