我最近选择了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
?
换句话说,如何获取列表中列表的长度?
答案 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))))
逐步:
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', '.', '.', '.', '.')]
map(lambda x: ''.join(x), zip(*grid))
将加入每一行>>> list(map(lambda x: ''.join(x), zip(*grid))) ['..00.00..', '.0000000.', '.0000000.', '..00000..', '...000...', '....0....']
'\n'.join
与分隔符作为新行加入>>> print('\n'.join(map(lambda x: ''.join(x), zip(*grid)))) ..00.00.. .0000000. .0000000. ..00000.. ...000... ....0....
注意:我们也可以通过print
和sep='\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()