Python:将字符串的二维列表转换为浮点数

3

我有一个字符串类型的二维列表,我想把它转换成整数。到目前为止,我尝试过以下方法:

[[float(i) for i in lst[j] for j in lst]

使用 for 循环:
for i in range(len(lst)):
    for j in range(len(lst[i])):
         lst[i][j]=float(lst[i][j])

两件事情很明显:你的列表推导式有不平衡的],所以它会出错。而且你试图转换为float,但你的问题说的是int - Burhan Khalid
你遇到了什么问题?使用“for”循环的解决方案可行。 - nbrooks
在第一种解决方案中,循环的顺序不正确。请查看下面我的答案。 - Developer
5个回答

8
>>> nums = [['4.58416458379', '3.40522046551', '1.68991195077'], ['3.61503670628', '5.64553650642', '1.39648965337'], ['8.02595866276', '8.42455003038', '7.93340754534']]
>>> [[float(y) for y in x] for x in nums]
[[4.58416458379, 3.40522046551, 1.68991195077], [3.61503670628, 5.64553650642, 1.39648965337], [8.02595866276, 8.42455003038, 7.93340754534]]

我不确定你的意图是什么,但由于你声称 for 循环版本无效,也许你想要一个一维的结果,在这种情况下:

>>> [float(y) for x in nums for y in x]
[4.58416458379, 3.40522046551, 1.68991195077, 3.61503670628, 5.64553650642, 1.39648965337, 8.02595866276, 8.42455003038, 7.93340754534]

这段代码应该用 try/except 包裹起来,以处理那些无法转换为浮点数的字符串。如果不行,至少要检查确保不会传入空字符串。 - Burhan Khalid
@BurhanKhalid 谢谢,但我会将其留作评论,如果必要的话,OP可以选择这样做。 - jamylak

3

你的两种解决方案都接近实现了。实际上,第二个方案应该已经可以使用,不过它或许还有一些改进空间。

我将演示如何更新列表推导式版本。这个版本(或许存在争议的)优势在于它创建了一个包含浮点数的新嵌套列表,并且不会改变原来包含字符串的嵌套列表(因此,如果需要,你可以将其用于其他用途):

new_lst = [[float(string) for string in inner] for inner in lst]

我会更新您的for循环代码。与使用列表推导式的版本不同,此代码直接在原始列表中修改内容。虽然您当前的代码应该可以很好地工作,但是下面的版本在我的观点中更具有“Pythonic”性质,因为它遍历了列表的内容,而不是遍历范围并对列表进行索引。仅需要索引进行赋值,并且我们使用内置函数enumerate获取字符串和索引:

for inner in lst:
    for index, string in enumerate(inner):
        inner[index] = float(string)

2
使用map(),这里是一个简化的示例。
nums = [['4.58416458379','1.68991195077'], ['8.02595866276'],
    ['3.61503670628', '5.64553650642', '1.39648965337']]

def myFloat(myList):
    return map(float, myList)

map(myFloat, nums)

1
newList = []
listSize = len(oldList)
for i in range(0, listSize):
    newList.append([])
    for j in range(0, 2):
        newList[i].append(float(oldData[i][j]))

这对我很有帮助,它创建了一个名为newList的新列表,并将所有元素从oldList转换为newList。虽然newList被初始化为一维数组,但第4行根据要转换的数组的维度添加了新维度。

应该替换掉"This helped me"。 - Istiak Morsalin

-2

将你的第一个解决方案更正为:

>>> sss = [['4.584','1.689'],['8.025'],['3.615','5.645','1.396']]
>>> fff = [float(s) for ss in sss for s in ss]      #notice the order of loops
>>> fff
[4.584, 1.689, 8.025, 3.615, 5.645, 1.396]

它可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接