【问题标题】:Problem with Boolean Expression with a string value from a lIst带有来自列表的字符串值的布尔表达式的问题
【发布时间】:2010-09-24 09:09:48
【问题描述】:

我有以下问题:

  # line is a line from a file that contains ["baa","beee","0"]
  line = TcsLine.split(",")
  NumPFCs = eval(line[2])
  if NumPFCs==0:
     print line

如果列表的第二个位置的值 == 0,我想打印文件中的所有行。

我打印了这些行,但之后会发生以下情况: Traceback(最近一次调用最后一次):

['baaa', 'bee', '0', '\n']

但是在我遇到下一个错误之后

ilation.py", line 141, in ?
    getZeroPFcs()
ilation.py", line 110, in getZeroPFcs
    NumPFCs = eval(line[2])
  File "<string>", line 0

你能帮帮我吗? 谢谢

什么0s

【问题讨论】:

    标签: python


    【解决方案1】:

    给猫剥皮的方法有很多种:)

    在我们开始之前,不要对不属于你的字符串使用 eval,所以如果字符串曾经离开你的程序;即它一直保存在一个文件中,通过网络发送,有人可以发送一些讨厌的东西。如果有人可以,你可以肯定有人会。

    您可能想查看您的数据格式。将 ["baa","beee","0", "\n"] 之类的字符串放在文件中对我来说没有多大意义。

    第一种也是最简单的方法是去掉不需要的东西并进行字符串比较。只要 '0' 字符串看起来始终相同,并且您不是真的在整数值 0 之后,只有字符模式,这将起作用:

    TcsLine = '["baa","beee","0"]'
    
    line = TcsLine.strip('[]').split(",")
    if line[2] == '"0"':
       print line
    

    第二种方式类似于第一种方式,只是我们将数字字符串转换为整数,产生您正在寻找的整数值(但打印不带所有引号的'line'):

    TcsLine = '["baa","beee","0"]'
    
    line = [e.strip('"') for e in TcsLine.strip('[]').split(",")]
    NumPFCs = int(line[2])
    if NumPFCs==0:
       print line
    

    难道字符串实际上是一个json数组?然后,如果我运行 Python=2.6 上导入 json,我可能会去 simplejson 正确解析它。然后将生成的 '0'-string 转换为前面示例中的整数。

    TcsLine = '["baa","beee","0"]'
    
    #import json # for >= Python2.6
    import simplejson as json # for <Python2.6
    
    line = json.loads(TcsLine)
    NumPFCs = int(line[2])
    if NumPFCs==0:
       print line
    

    【讨论】:

      【解决方案2】:

      让我解释一下你在这里做什么。

      如果你写:

      NumPFCs = eval(line[2])
      

      求值顺序为:

      • 取字符串行的第二个字符,即引号'"'
      • 将此引用作为 python 表达式求值,这是一个错误。

      如果你把它写成:

      NumPFCs = eval(line)[2]
      

      那么评估的顺序是:

      • 评估该行,生成一个 python 列表
      • 取该列表的第二个元素,这是一个单字符字符串:“0”
      • 字符串不能与数字进行比较;这也是一个错误。

      按照您的说法,您希望执行以下操作:

      NumPFCs = eval(eval(line)[2])
      

      或者,更好的是,将 NumPFCs 与字符串进行比较:

      if NumPFCs == "0":
      

      但这可能出错的方式几乎数不胜数。你应该忘记eval并尝试使用其他方法:字符串拆分,正则表达式等。其他人已经提供了一些建议,我相信会有更多的建议。

      【讨论】:

        【解决方案3】:

        我建议使用正则表达式来捕获如何指定 0 的所有变体:带双引号,不带任何引号,带单引号,引号外有额外空格,引号内有空格,您希望如何处理方括号等。

        【讨论】:

          【解决方案4】:

          我在您的代码段中看到了一些问题:

          1. 您假设列表始终至少包含 3 个元素
          2. 如果包含的字符串不是有效的python,eval 将引发异常
          3. 您说您想要第二个元素,但您访问的是第三个元素。

          这是一种更安全的方法

          line=TcsLine.split(",")
          if len(line) >=3 and line[2].rfind("0") != -1:
               print line
          

          【讨论】:

          • 是不是表示如果第三个值为“101”就会被打印出来?
          • 我同意使用 line[2] == "0" 而不是 rfind 会更好
          【解决方案5】:

          您的问题有点难以阅读,但使用 eval 绝对不是一个好主意。要么直接进行字符串比较:

          line=TcsLine.split(",")
          if line[2] == "0":
              print line
          

          或使用int

          line=TcsLine.split(",")
          if int(line[2]) == 0:
              print line
          

          不管怎样,你的坏数据会让你失望。

          我还建议阅读PEP 8

          【讨论】:

          • 包含 '"0"]' 的字符串是否可靠转换?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-21
          • 2017-10-05
          • 2018-09-07
          • 1970-01-01
          相关资源
          最近更新 更多