首页 > 解决方案 > 仅使用 for 循环在 python 中转置图像

问题描述

我需要在不使用任何其他导入语句或函数库的情况下在 python 中转置图像。图像作为参数传递给我的函数。该图像是 RGB 对象的二维表。我有以下代码,但它给了我一个索引错误 - 列表索引超出范围。我究竟做错了什么?

#Find the size of the non-ragged table
numrows = len(image) 
numcols = len(image[0]) # All rows have same no. cols

# Build the table
result = [] # Result accumulator
for m in range(numcols):
    
    # Make a single row
    row = [] # Single row accumulator
    for n in range(numrows):
        row.append(image[n][m])
    
    # Add the result to the table
    result.append(row)
    image.clear()
    image.append(row)
return True

标签: pythonpython-3.ximage

解决方案


每次通过外循环时,您都会尝试完全擦除 image,然后将最近计算的附加row到它。但这是您的数据;下一次通过外循环时,您尝试构建下一行,row.append(image[n][m])就好像什么都没发生一样。

您已经在使用result累积结果;image过程中不要修改。它不仅会导致您看到的问题,而且是糟糕的界面设计:使用您的代码的人(可能是您,几个月后您已经忘记了自己在想什么)绝对不会期望image在计算转置版本并给它一个单独的名称时完全改变。

您有一个名为 的列表result,并且您显然是在函数中执行此操作;自然要做的事情是return result,而不是修改任何输入数据。如果由于某种原因您必须修改输入列表,那么这样做的方法是在所有循环之后将的内容result分配回image列表,一次类似于. 但是在这种情况下,任何事情都没有充分的理由;并不意味着任何有用的东西(如果出现问题,您不应该任何其他值;您应该改为引发 Exceptionimage[:] = resultreturnreturn True return False- 这就是他们的目的)。由于在这种情况下,调用代码仅通过使用 after 调用函数的修改版本来获取所需的所有信息image,因此返回值是无用的。标准库也采用这种约定


推荐阅读