列表理解不服从if语句

时间:2014-06-30 21:52:11

标签: python

我程序的这个存根

with open(fi) as f:
    lines = f.readlines()
    lines = [line.split('!')[0] for line in lines if not line.startswith('!') and line.strip()] # Removing line and inline comments
    for line in lines:
        print line, len(line), bool(not line.startswith('!') and line.strip())

给我输出

conduction-guess                        double_array    optional    68 True
valence                                 character       optional    68 True
valence-guess                           double_array    optional    68 True
                                                                    68 False
saturated-bond-length-factor            double          required    68 True

不应该包含bool值为False的行吗?我输了。 我认为它可能是短路的,但翻转表达式也无济于事。

为了澄清,我希望我的列表是以' True'结尾的行的列表。在上面的代码部分。

3 个答案:

答案 0 :(得分:3)

第一个not line.startswith('!') and line.strip()正在运行与{2}值不同的line值。列表推导会导致lines替换为原始值!中每个字符串的第一个lines分隔字段的列表,而这是新的lines然后代码打印出来。例如,如果lines最初包含字符串" !foo",则此字符串将在理解中传递条件,但只有!之前的部分 - 单个空格 - 将保存到新的lines列表,单个空格不会导致line.strip()返回true。

答案 1 :(得分:2)

如果你的文件中有一行除了第一列以外的地方有感叹号,你就可以看到类似的东西。 e.g:

line = " !                    "

答案 2 :(得分:0)

line.strip()返回一个新字符串,它不是布尔值。

更新的代码:

with open(fi) as f:
    lines = [ line.strip() for line in f ]
    # remove exclamation points
    lines = [ line.split('!')[0] for line in lines 
              if not line.startswith('!') 
              ]

    # 3rd col will always be True
    for line in lines:
        print line, len(line), bool(not line.startswith('!'))