Python 如何在嵌套列表中将元素从string更改为float

Python 如何在嵌套列表中将元素从string更改为float,python,string,Python,String,我想使用列表理解将嵌套列表中的元素更改为浮动 lines = [[1, '74.37000326528938', 'Psychologist'], [2, '67.49686206937491', 'Psychologist'], [3, '74.92356434760966', 'Psychologist']] >>> lines = [[line[0]] + [float(x) for x in line[1]] + [line[2]] for line in lines]

我想使用列表理解将嵌套列表中的元素更改为浮动

lines = [[1, '74.37000326528938', 'Psychologist'], [2, '67.49686206937491', 'Psychologist'], [3, '74.92356434760966', 'Psychologist']]
>>> lines = [[line[0]] + [float(x) for x in line[1]] + [line[2]] for line in lines]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: .
我认为这与小数点有关,因为该代码不适用于此示例:

mylist = [['1','2.555','3'],['5','6.777','7']]
datl3 = [[int(x) for x in line[0]] + line[1:] for line in mylist]
datl4 = [[line[0]] + [float(x) for x in line[1]] + [line[2]] for line in datl3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: .
mylist=['1'、'2.555'、'3']、['5'、'6.777'、'7']
datl3=[[int(x)表示第[0]行中的x]]+第[1]行表示mylist中的行]
datl4=[[line[0]]+[float(x)表示第[1]行中的x]+[line[2]]表示第三行中的x]
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:无法将字符串转换为浮点值:。

您很接近,但问题是您在
行[1]
上使用了一个
for
循环,它是一个字符串。因此,您正在循环遍历浮点数的每个元素/字符。当到达小数点时,您会得到
值错误:无法将字符串转换为浮点:。
。您的第二个示例之所以有效,是因为您只有一个不带任何小数的单位数字符串
2
6

如果您坚持使用代码,只需将索引
行[1]
替换为
行[1:2]
,如下所示

lines = [[line[0]] + [float(x) for x in line[1:2]] + [line[2]] for line in lines]
然而,下面是一种更简洁的方法,通过直接访问子列表的第二个元素来避免不必要的中介for循环。您不需要创建三个子列表,然后使用
+

lines = [[line[0], float(line[1]), line[2]] for line in lines]
输出

[[1, 74.37000326528938, 'Psychologist'],
 [2, 67.49686206937491, 'Psychologist'],
 [3, 74.92356434760966, 'Psychologist']]

您很接近,但问题是您在
行[1]
上使用了一个
for
循环,它是一个字符串。因此,您正在循环遍历浮点数的每个元素/字符。当到达小数点时,您会得到
值错误:无法将字符串转换为浮点:。
。您的第二个示例之所以有效,是因为您只有一个不带任何小数的单位数字符串
2
6

如果您坚持使用代码,只需将索引
行[1]
替换为
行[1:2]
,如下所示

lines = [[line[0]] + [float(x) for x in line[1:2]] + [line[2]] for line in lines]
然而,下面是一种更简洁的方法,通过直接访问子列表的第二个元素来避免不必要的中介for循环。您不需要创建三个子列表,然后使用
+

lines = [[line[0], float(line[1]), line[2]] for line in lines]
输出

[[1, 74.37000326528938, 'Psychologist'],
 [2, 67.49686206937491, 'Psychologist'],
 [3, 74.92356434760966, 'Psychologist']]

问题是,这条生产线试图同时做太多事情:

datl4 = [[line[0]] + [float(x) for x in line[1]] + [line[2]] for line in datl3]
问题发生在内部列表理解中:

[float(x) for x in line[1]]
但是什么是
行[1]
?它来自datl3中的行的迭代
。让我们看看它有什么价值:

>>> [line[1] for line in datl3]
['2.555', '6.777']
因此,当您对第[1]行中的x执行
[浮点(x)]
时,您正在迭代每个数字字符串的字符…
“2”
然后
然后
“5”
然后
“5”
然后
“5”
。但是
不是有效的浮点

我认为您要做的是将
行[1]
转换为
浮点值

lines = [[line[0], float(line[1]), line[2]] for line in lines]

问题是,这条生产线试图同时做太多事情:

datl4 = [[line[0]] + [float(x) for x in line[1]] + [line[2]] for line in datl3]
问题发生在内部列表理解中:

[float(x) for x in line[1]]
但是什么是
行[1]
?它来自datl3中的行的迭代
。让我们看看它有什么价值:

>>> [line[1] for line in datl3]
['2.555', '6.777']
因此,当您对第[1]行中的x执行
[浮点(x)]
时,您正在迭代每个数字字符串的字符…
“2”
然后
然后
“5”
然后
“5”
然后
“5”
。但是
不是有效的浮点

我认为您要做的是将
行[1]
转换为
浮点值

lines = [[line[0], float(line[1]), line[2]] for line in lines]
它可以通过列表理解来完成,只需正确设置,检查
str
中的小数点,如果是,则将该项设置为
int

l = [[float(j) if '.' in str(j) else j for j in i] for i in l]
它可以通过列表理解来完成,只需正确设置,检查
str
中的小数点,如果是,则将该项设置为
int

l = [[float(j) if '.' in str(j) else j for j in i] for i in l]

你为什么要建立一个新的列表?
for l in line:l[1]=float(l[1])
是否应该工作?@coldspeed for循环是否只会更改元素l[1]?否,因为
l
是对内部列表的引用,它最终会修改原始的
。为什么要创建新列表?
对于行中的l:l[1]=float(l[1])
是否应该工作?@coldspeed for循环是否只会更改元素l[1]?否,因为
l
是对内部列表的引用,它最终会修改行[1:2]中x的原始
是获取
行[1]的一种复杂方式
@code学徒:我同意,但我的目的是告诉OP他/她的方法出了什么问题。阅读所有三个答案,我觉得我们都在讲述同样的事情,关于你可以添加到你的问题中的小数,你可以展示如何以更清晰、简洁的方式编写最终的解决方案。
对于第[1:2]行中的x
是一种获取第[1]行的复杂方式
@code学徒:我同意,但我的目的是告诉OP他/她的方法出了什么问题。读了这三个答案,我觉得我们都在讲述同样的事情,关于小数点,你可以通过展示如何以更清晰简洁的方式写出最终的答案来添加到你的问题中。