如何将列表中的字符串值更改为 Python 中的浮点数

Posted

技术标签:

【中文标题】如何将列表中的字符串值更改为 Python 中的浮点数【英文标题】:How to change a string value that is in a list to a float in 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 中拥有一个混合类型的列表并不理想。为什么不将其保留为字符串列表? 【参考方案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))

【讨论】:

以上是关于如何将列表中的字符串值更改为 Python 中的浮点数的主要内容,如果未能解决你的问题,请参考以下文章

只要新值与当前值不同,Oracle SQL 将字段的值更改为列表中的其他值?

将 Python DataFrame 中的值更改为二进制标志(For-Loop 问题)

如何将 SQL 记录中的一个字段的值更改为另一个表中的值?

如何在 jQuery 导出时将 dataTables 中的所有 tableHeader 值更改为大写

Python:将浮动值更改为颜色

如何将 true 或 false 的值更改为文本值类型 我正在检查整个表中的行 注意该表是数据表类型?