【问题标题】:How to change a string value that is in a list to a float in Python如何将列表中的字符串值更改为 Python 中的浮点数
【发布时间】:2021-11-14 05:57:01
【问题描述】:

我正在尝试将列表中的数字字符串转换为浮点数,但遇到了困难,可能是因为它位于列表列表中。我无法确定修复方法。该列表稍后将转换为字典

我的列表格式如下:

[['PokedexNumber','Name','Type','Total','HP','Attack','Defense','SpecialAttack','SpecialDefense','Speed'],
 ['001','Bulbasaur','GrassPoison','318','45',
  '49','49','65','65','45'],
 ['002', 'Ivysaur', 'GrassPoison', '405', '60', '62', '63', '80', '80', '60']]

我的代码是:

for i in newest_list:
   try:
       float(i)
   except ValueError:
       i

我得到的错误是:

TypeError: float() 参数必须是字符串或数字,而不是“列表”

【问题讨论】:

  • 为什么要这样做?我想说的是,通常在 Python 中拥有一个混合类型的列表并不理想。为什么不将其保留为字符串列表?

标签: python list try-catch valueerror


【解决方案1】:

那是因为你有一个大小为 3Xn 的二维数组

您需要添加另一个循环来遍历每个内部列表

for l in newest_list:
    for string in inner_list:
        try:
            float(string)
        except ValueError:
            pass

【讨论】:

    【解决方案2】:

    由于您有一个列表列表,请尝试添加另一个 for 循环来迭代内部列表:

    L = [['PokedexNumber', 'Name', 'Type', 'Total', 'HP', 'Attack', 'Defense', 'SpecialAttack', 'SpecialDefense', 'Speed'],
         ['001', 'Bulbasaur', 'GrassPoison', '318', '45',
          '49', '49', '65', '65', '45'],
         ['002', 'Ivysaur', 'GrassPoison', '405', '60', '62', '63', '80', '80', '60']]
    
    for i in L:
        ## Added
        for j in i:
        ## End
           try:
               float(j)
           except ValueError:
                j
    

    使用列表推导,这变得更加容易:

    def try_parse_float(x):
        try:
            return float(x)
        except ValueError:
            return x
    
    vals = [(try_parse_float(j)) for i in L for j in i]
    

    或者,受@mozway 回答的启发:

    vals = [float(j) if j.isnumeric() else j for i in L for j in i]
    

    【讨论】:

      【解决方案3】:

      您的列表实际上是列表的列表,而不是列表,而不是字符串或数字。

      一个工作的 for 循环看起来像这样

      for l in newest_list:
          for i in l:
              try:
                  float(i)
              except ValueError:
                  pass # using pass here as just using i doesn't do anything
      

      【讨论】:

        【解决方案4】:

        使用简单的列表推导和str.isnumeric 方法:

        [[float(item) if item.isnumeric() else item for item in l] for l in newest_list]
        

        输出:

        [['PokedexNumber', 'Name', 'Type', 'Total', 'HP', 'Attack',
          'Defense',  'SpecialAttack', 'SpecialDefense', 'Speed'],
         [1.0, 'Bulbasaur', 'GrassPoison', 318.0, 45.0, 49.0, 49.0, 65.0, 65.0, 45.0],
         [2.0, 'Ivysaur', 'GrassPoison', 405.0, 60.0, 62.0, 63.0, 80.0, 80.0, 60.0]]
        

        【讨论】:

        • 不错!请注意,您不需要第二个列表理解(请参阅下面的答案)
        • @rv.kvetch 是的,你这样做,否则它会将子列表链接成一个;)
        • 哦,是的,你是对的。哈哈
        【解决方案5】:

        通过第二个循环,您可以访问列表中的列表。 然后检查内部列表中的值是否可以转换为浮点数。 如果是,将字符串列表元素替换为浮点类型。

        for idx,value in enumerate(newest_list):
            for idx2, value2 in enumerate(value):
                try:
                    float(value2)
                    newest_list[idx][idx2] = float(value2)
                except ValueError:
                    pass
        
        # To check the new types of the variables:
        for idx,value in enumerate(newest_list):
            for idx2, value2 in enumerate(value):
                print(type(value2))
        
        

        【讨论】:

          猜你喜欢
          • 2019-11-23
          • 2018-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-06
          • 2014-11-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多