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

时间:2018-09-30 00:26:27

标签: 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]
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: .

3 个答案:

答案 0 :(得分:1)

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

如果您坚持执行自己的代码,只需在切片位置按如下所示用line[1]替换索引line[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 :(得分:1)

问题在于此行尝试一次执行太多操作:

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]]时,您要遍历每个数字字符串的字符... "2"然后是"."然后是"5"然后是"5"然后是{ {1}}。但是"5"不是有效的浮点数。

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

float

答案 2 :(得分:0)

可以通过 list comprehension 完成,只需设置正确,检查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']]