我刚开始用小脚本学习 python。我遇到了一个测验,如果第一行与第一列相同,则确定列表是对称的, 第二行与第二列相同,依此类推。
def symmetric(block):
n = len(block)
i = 0
for i in range(n-1):
j = 0
for j in range(n-1):
if (block[i][j] != block[j][i]):
return False
j +=1
i +=1
return True
结果
print symmetric([["cat", "dog", "fish"],
["dog", "dog", "dog"],
["fish","fish","cat"]])
应该是假的。
但是,此代码始终返回 True,在调试器中我可以看到 block[i][j] != block[j][i] 返回 True 但 if block 未执行。比较有什么问题或 if block 的组成不正确吗?
请您参考如下方法:
失败的主要原因是因为你应该写range(n)而不是 range(n-1) (上限是独占的)。喜欢:
def symmetric(block):
n = len(block)
for i in range(<b>n</b>):
for j in range(<b>n</b>):
if block[i][j] != block[j][i]:
return False
return True
不过,这个函数有几个奇怪的地方:
- 你初始化
i = 0和j = 0.这不是必需的:在 Python 中,for循环将为您声明变量; - 您对
i执行递增/递减和j,这又是没有必要的。for循环枚举迭代器/生成器并将每个值分配给i和j; - 通常不为
if写括号声明。
此外,您实际上可以使用带有 all(..) 的两行代码使这段代码更优雅。内置函数:
def symmetric(block):
n = len(block)
return <b>all(block[i][j] == block[j][i] for i in range(n) for j in range(n))</b>
这是一种更声明式和更显式的代码编写风格。因为这里的代码几乎是不言自明的:“是否返回 block[i][j] == block[j][i] 中的 i 和 range(n) 中的 j 的所有 range(n) ”
终于赞@Błotosmętek在他们的评论中说,你不必检查 block[2][0] == block[0][2]如果你已经检查了 block[0][2] == block[2][0] .所以你可以通过写来提高性能(大约一半):
def symmetric(block):
n = len(block)
return all(block[i][j] == block[j][i] for i in range(n) for j in range(<b>i</b>))
