pal*_*ind 104 python multidimensional-array
在一个程序中,我写的是需要旋转一个二维数组.寻找最佳解决方案我找到了这个令人印象深刻的单线工作:
rotated = zip(*original[::-1])
Run Code Online (Sandbox Code Playgroud)
我现在正在我的程序中使用它,它可以正常运行.我的问题是,我不明白它是如何工作的.
如果有人能解释所涉及的不同功能如何达到预期效果,我将不胜感激.
kin*_*all 83
这是一个聪明的一点.这是细分:
[::-1] - 以相反的顺序生成原始列表的浅表副本.也可以使用reversed()哪个会在列表上生成反向迭代器,而不是实际复制列表(更高的内存效率).*- 使原始列表中的每个子列表成为一个单独的参数zip()(即,解压缩列表)zip() - 从每个参数中获取一个项目并从中创建一个列表(好,一个元组),并重复直到所有子列表都用完为止.这是换位实际发生的地方.所以假设你有这个:
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
Run Code Online (Sandbox Code Playgroud)
你首先得到这个(浅,反向副本):
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
Run Code Online (Sandbox Code Playgroud)
接下来,每个子列表都作为参数传递给zip:
zip([7, 8, 9], [4, 5, 6], [1, 2, 3])
Run Code Online (Sandbox Code Playgroud)
zip() 从每个参数的开头重复使用一个项目,并从中生成一个元组,直到没有更多的项目,导致:
[(7, 4, 1),
(8, 5, 2),
(9, 6, 3)]
Run Code Online (Sandbox Code Playgroud)
而鲍勃是你的叔叔.
要在关于向另一个方向旋转它的评论中回答@ IkeMiguel的问题,它非常简单:你只需要反转进入的序列zip和结果.第一个可以通过移除来实现,[::-1]第二个可以通过抛出reversed()整个东西来实现.由于reversed()回报率在列表上的迭代器,我们需要把list()周围那将其转换.所以:
rotated = list(zip(*reversed(original)))
Run Code Online (Sandbox Code Playgroud)
当然,您也可以简单地顺时针旋转列表三次.:-)
And*_*ark 80
考虑以下二维列表:
original = [[1, 2],
[3, 4]]
Run Code Online (Sandbox Code Playgroud)
让我们一步一步地分解它:
>>> original[::-1] # elements of original are reversed
[[3, 4], [1, 2]]
Run Code Online (Sandbox Code Playgroud)
此列表将传递给zip()使用参数解包,因此zip调用最终将等效于此:
zip([3, 4],
[1, 2])
# ^ ^----column 2
# |-------column 1
# returns [(3, 1), (4, 2)], which is a original rotated clockwise
Run Code Online (Sandbox Code Playgroud)
希望评论清楚地说明了什么zip,它将根据索引对每个输入可迭代的元素进行分组,或者换句话说,它将列分组.
小智 16
这有三个部分:
只是一个观察.输入是一个列表列表,但非常好的解决方案的输出:rotate = zip(*original [:: - 1])返回一个元组列表.
这可能是也可能不是问题.
但是,它很容易纠正:
original = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
def rotated(array_2d):
list_of_tuples = zip(*array_2d[::-1])
return [list(elem) for elem in list_of_tuples]
# return map(list, list_of_tuples)
print(list(rotated(original)))
# [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
Run Code Online (Sandbox Code Playgroud)
列表comp或地图都将内部元组转换回列表.
| 归档时间: |
|
| 查看次数: |
75975 次 |
| 最近记录: |