繁体   English   中英

如何将元素从字符串更改为浮动在嵌套列表中

[英]How to change an element from string to float in a nested list

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

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','3'],['5','6','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]
>>> datl4
[[1, 2.0, '3'], [5, 6.0, '7']]

我认为这与小数点有关,因为该代码不适用于此示例:

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: .

您很接近,但问题是您在line[1]上使用了for循环,该循环是一个字符串。 因此,您正在遍历浮点数的​​每个元素/字符。 当达到小数点时. 您得到ValueError: could not convert string to float: . 第二个示例有效,因为那里只有一个数字字符串26没有任何小数。

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

lines = [[line[0]] + [float(x) for x in line[1:2]] + [line[2]] for line in lines]

但是,一种更简洁的方法是通过直接访问子列表的第二个元素来避免不必要的中介循环。 您无需创建三个子列表,然后使用+添加它们

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]]

但是line[1]什么? 它来自for line in datl3的迭代。 因此,让我们看看它具有什么值:

>>> [line[1] for line in datl3]
['2.555', '6.777']

因此,当您[float(x) for x in line[1]]执行[float(x) for x in line[1]]您要遍历每个数字字符串的字符... "2"然后是"." 然后是"5"然后是"5"然后是"5" 但是"." 不是有效的浮点数。

我认为您要做的只是将line[1]转换为float

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]
 [[1, 74.37000326528938, 'Psychologist'], [2, 67.49686206937491, 'Psychologist'], [3, 74.92356434760966, 'Psychologist']] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM