我刚开始用小脚本学习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块。比较有什么问题或者if块没有正确组合吗?
答案 0 :(得分:5)
失败的主要原因是你应该写range(n)
而不是range(n-1)
(上限是独占)。像:
def symmetric(block):
n = len(block)
for i in range(n):
for j in range(n):
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 all(block[i][j] == block[j][i] for i in range(n) for j in range(n))
这是一个更声明和更多显式样式的代码。从这里开始,代码几乎是自我解释的:“返回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(i))
答案 1 :(得分:1)
您应该使用range(n)
而不是range(n-1)
;由range
生成的序列不包括上限。
答案 2 :(得分:1)
def symmetric(block):
n = len(block)
for i in range(n):
for j in range(n):
print i, j
if (block[i][j] != block[j][i]):
return False
return True
print symmetric([["cat", "dog", "fish"],
["dog", "dog", "dog"],
["fish","fish","cat"]])
在python中你不必声明或增加用于循环的变量,python“for-loop”足够聪明,可以为我们做。
你还必须研究范围函数在python中是如何工作的,range()可以用三种方式调用,
范围(循环的N次):范围将返回从0到N-1的N个整数的列表。
范围(S-start位置,N-end位置):在这种情况下,range将返回从S到N-1的(N-S)整数列表。
范围(S-start位置,N-end位置,K-steps):此范围将返回从S到N-1的间隔为K的(N-S)/ K整数列表。
在你说range(n-1)
的情况下,你的循环只在索引0上跳过索引2跳过,难怪你每次都得到真。