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



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

def foo(i, axis):
    for j in range(9):
        if axis == 'x':
            doSomething(grid[i][j])
            doSomethingElse(grid[i][j])
            grid[i][j] += 1;
        else:
            doSomething(grid[j][i])
            doSomethingElse(grid[j][i])
            grid[i][j] -= 1;

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

你可以试试这个方案

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的两个块中因为这样更容易阅读和维护

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

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

最新更新