python - 仅使用 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
解决方案
每次通过外循环时,您都会尝试完全擦除 image
,然后将最近计算的附加row
到它。但这是您的源数据;下一次通过外循环时,您尝试构建下一行,row.append(image[n][m])
就好像什么都没发生一样。
您已经在使用result
累积结果;image
过程中不要修改。它不仅会导致您看到的问题,而且是糟糕的界面设计:使用您的代码的人(可能是您,几个月后您已经忘记了自己在想什么)绝对不会期望image
在计算转置版本并给它一个单独的名称时完全改变。
您有一个名为 的列表result
,并且您显然是在函数中执行此操作;自然要做的事情是return result
,而不是修改任何输入数据。如果由于某种原因您必须修改输入列表,那么这样做的方法是在所有循环之后将的内容result
分配回image
列表,一次:类似于. 但是在这种情况下,任何事情都没有充分的理由;并不意味着任何有用的东西(如果出现问题,您不应该或任何其他值;您应该改为引发 Exceptionimage[:] = result
return
return True
return False
- 这就是他们的目的)。由于在这种情况下,调用代码仅通过使用 after 调用函数的修改版本来获取所需的所有信息image
,因此返回值是无用的。标准库也采用这种约定。
推荐阅读
- python - 撤消python中的更改
- sql - 我可以在 sql hana 占位符中放置一个 sql 查询吗
- plugins - 如何将值从插件返回到 action/js?
- r - 在查看器窗格中打开 R Markdown
- python - 多进程 - 如何将变量传递给并行执行的函数
- android-jetpack-compose - 如何在 JetpackCompose 中设置脚手架抽屉宽度?
- javascript - 在 JavaScript 中的字符后插入逗号
- c++ - 什么是 foo*(*)?
- google-chrome - CSP:Firefox 83 和 Chromium 87 之间的“script-src”区别?
- prolog - Prolog中的反向转换