为多维列表Python有条件地交换for循环中的轴

为多维列表Python有条件地交换for循环中的轴,python,multidimensional-array,Python,Multidimensional Array,我有一组函数,在遍历二维列表时有条件地切换轴。到目前为止,我正在使用if语句,并复制for循环中的代码,并“手动”交换轴: 是否有一种“优雅”的方法来交换轴,以防止在for循环中为每个条件重复使用代码?这将大大提高代码的可读性。 谢谢。可能有一个更简洁的/pythonic的解决方案,但这里有一个可能的改进: def foo(i, axis): for j in range(9): if axis == 'x': x, y = i, j

我有一组函数,在遍历二维列表时有条件地切换轴。到目前为止,我正在使用if语句,并复制for循环中的代码,并“手动”交换轴:

是否有一种“优雅”的方法来交换轴,以防止在for循环中为每个条件重复使用代码?这将大大提高代码的可读性。
谢谢。

可能有一个更简洁的/pythonic的解决方案,但这里有一个可能的改进:

def foo(i, axis):

    for j in range(9):
        if axis == 'x': 
            x, y = i, j
        else:
            x, y = j, i
        doSomething(grid[x][y])
        doSomethingElse(grid[x][y])

继续评论

def foo(i, axis):

    def doManythings(x, y):
        doSomething(grid[x][y])
        doSomethingElse(grid[x][y])

    for j in range(9):
        if axis == 'x': 
            doManythings(i, j)
            grid[i][j] += 1
        else:
            doManythings(j, i)
            grid[i][j] -= 1

你可以试试这个解决方案

def foo(i, axis):
    for j in range(9):
        value = grid[i][j] if axis == 'x' else grid[j][i]
        doSomething(value)
        doSomethingElse(value)
第3行是一个内联IF语句,其工作原理类似于简单的IF,但仅压缩在一行中

if axis == 'x':
    value = grid[i][j] 
else:
    value = grid[j][i]

最好只编写一个函数调用,而不要将它包含在if的两个块中,因为它更易于阅读和维护

为什么不为
doSomething
doSomethingElse
块创建一个函数,并作为参数传递
(i,j)
(j,i)
?这将适用于该特定示例,但是,网格[][]上的操作在整个代码中差别很大。我只是以将数组传递到函数中为例。我已经稍微修改了答案,让它更清楚。如果你不使用numpy,我怀疑你想这么做?如果是这样,一个简单的TMP= GrID.TtMP=格子.t就足够了,TMPTMP将是GRIDGET的一个视图,不含糊不清,您可以重用其中一个。请考虑编辑您的帖子,以添加更多关于您的代码所做的解释以及它为什么会解决问题的更多解释。一个只包含代码的答案(即使它在工作)通常不会帮助OP理解他们的问题。
if axis == 'x':
    value = grid[i][j] 
else:
    value = grid[j][i]