如果python中的块没有用True语句执行

时间:2017-06-13 09:52:33

标签: python string if-statement

我刚开始用小脚本学习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块没有正确组合吗?

3 个答案:

答案 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 = 0j = 0。这不是必需的:在Python中,for循环将为您声明变量;
  • 您在ij上执行增量/减量,这也不是必需的。 for循环枚举可迭代/生成器,并将每个值分配给ij;
  • 通常不会为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]irange(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跳过,难怪你每次都得到真。