gpt4 book ai didi

python - 使用循环/递归镜像矩阵中的行?

转载 作者:太空狗 更新时间:2023-10-30 00:54:50 25 4
gpt4 key购买 nike

给定一些矩阵,我需要镜像矩阵中的所有行。例如

[[2, 1],
[4, 3]]

会变成

[[1, 2],
[3, 4]]

我设法在 (2 x 2) 的情况下做到了。但是我在镜像这样的东西时遇到了麻烦:

[[1, 2, 3, 4],
[1, 2, 3, 4]]

这必须成为

[[4, 3, 2, 1],
[4, 3, 2, 1]]

我想用循环/递归来做到这一点。如果我使用递归,我可能会首先交换最内部的元素作为基本步骤,然后从这里开始我们将通过还包括外部元素并交换它们来使矩阵更大。但是,我在递归步骤中遇到了问题。交换了最里面的元素之后,我想在矩阵中包括最里面的下一个元素,并交换它们,然后继续这样直到我们到达外部元素。这如何在代码中实现?这是我到目前为止所做的:

matrix = [[1, 2, 3, 4],
[1, 2, 3, 4]]

def mirror(matrix):
# This corresponds to the basic step. The two inner most elements get swapped.
if len(matrix) == 2:
for i in range(len(matrix)):
for j in range(len(matrix)):
# Store one element in a temporal variable
temp = matrix[i][j]
matrix[i][j] = matrix[i][len(matrix) - 1]
matrix[i][len(matrix)-1] = temp
return matrix

else:
# Recursion step
for i in range(len(matrix)):
for j in range(len(matrix)):
return (matrix + mirror(matrix[(len(matrix) // 2) - 1 : len(matrix)]))

我认为递归步骤是错误的。我尝试使用切片运算符,但不确定如何正确完成。对此问题的任何帮助将不胜感激。

最佳答案

递归解决方案非常简单,只需遍历整个数组以反转每个子数组:

arr= [[2, 1],
[4, 3]]

def reve(l):
# if we have recursed across all sub arrays just return empty list
if not l:
return []
# else reverse the first current sublist l[0] and recurse on the remaining sublists
return [l[0][::-1]] + reve(l[1:])


print(reve(arr))
[[1, 2], [3, 4]]

可以简洁地写成:

def reve(l):
return [l[0][::-1]] + reve(l[1:]) if l else []

如果你想要它就地:

arr = [[1, 2, 3, 4],
[1, 2, 3, 4]]

def reve(l):
if not l:
return
# call inplace list.reverse on each sublist
l[0].reverse()
return reve(l[1:])


reve(arr)

输出:

[[4, 3, 2, 1], [4, 3, 2, 1]]

最后,我们可以使用 iter 和特殊方法 __length__hint 实现您想要的 inplace,完全没有切片:

def reve(l):
if l.__length_hint__() == 0:
return
sub = next(l)
sub.reverse()
return reve(l)


reve(iter(arr))

print(arr)

输出:

[[4, 3, 2, 1], [4, 3, 2, 1]]

关于python - 使用循环/递归镜像矩阵中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34106708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com