首页 > 解决方案 > 如何将列表列表中的字符串转换为原地浮动?

问题描述

my_list=[['A','B','C','0.0'],['D','E','F','1.0'],['G','H','I','0'],['J','K','L','M']

我试过做

new_list=[[float(x) for x in i if x.isnumeric()] for i in my_list]

输出

[[0.0],[1.0],[0],[]]

预期产出

[['A','B','C',0.0],['D','E','F',1.0],['G','H','I',0],['J','K','L','M']

我不知道如何将最终值转换为浮点数并就地修改值,我尝试过追加。我也尝试过其他问题的答案,但他们创建了一个新列表,但我想更改原始列表。

编辑更改了我的列表以包含小数。如果数字(字符串)为“0”但不是小数“0.0”或“1.0”,则以下答案有效。

标签: pythonpython-3.x

解决方案


x如果x不是数字,则需要保留。你很接近:

>>> my_list = [['A','B','C','0'], ['D','E','F','1'], ['G','H','I','J']]
>>> new_list = [[float(x) if x.isnumeric() else x for x in i] for i in my_list]
>>> new_list
[['A', 'B', 'C', 0.0], ['D', 'E', 'F', 1.0], ['G', 'H', 'I', 'J']]

请注意if x.isnumeric() else x列表推导的内部,它位于推导的开头,而不是结尾(因为它是三元条件)


正如您所注意到的,这是创建一个新列表,而不是修改原始列表。如果要保留原始列表,基本的 for 循环会更好:

for i, sublist in enumerate(my_list):
    for j, x in enumerate(sublist):
        try:
            my_list[i][j] = float(x)
        except ValueError:
            pass

[['A', 'B', 'C', 0.0], ['D', 'E', 'F', 1.0], ['G', 'H', 'I', 'J']]

推荐阅读