将字符串列表中的数字转换为浮点数

3

我正在尝试完成一个练习,其中我有一个列表:

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']

我需要将其转换为另一个列表,格式如下:

list_2 = [['chocolate', 1.20], ['book', 5.50], ['hat', 3.25]]

在第二个列表中,数字必须为浮点数不含 ' '
到目前为止,我已经编写了以下代码:
for item in list_1:
    list_2.append(item.split(';'))

输出结果看起来大致正确:
[['chocolate', '1.20'], ['book', '5.50'], ['hat', '3.25']]

但是我该如何将这些数字转换为浮点数并去除双引号呢?

我尝试了:

for item in list_2:
    if(item.isdigit()):
        item = float(item)

获取:

AttributeError: 'list' object has no attribute 'isdigit'
7个回答

1
list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']
list_2 = [x.split(';') for x in list_1]
list_3 = [[x[0], float(x[1])] for x in list_2]

你可以改进这个代码,去掉对list_2的中间赋值。list_3 = [[y[0], float(y[1])] for x in list_1 for y in [x.split(';')]] - Chris
我认为这并不是一种改进,因为在我看来它变得有点难以阅读。 - William Rosenbaum
这只是个人意见。除非list_2在其他地方是必需的,否则它们都可以在不创建整个额外列表的情况下完成相同的工作。 - Chris

1
item 是一个类似于 ['巧克力','1.20'] 的列表。你应该在 item[1] 上调用 isdigit(),而不是在 item 上调用。但是当字符串包含 时,isdigit() 不为真,因此这种方法也无法工作。
将分割后的字符串放入变量中,然后在第二个元素上调用 float()
for item in list_1:
    words = item.split(';')
    words[1] = float(words[1])
    list_2.append(words)

您可能希望将拆分限制为最多一次拆分。 - Chris

1

我不知道这对你是否有帮助。 但是,我认为使用函数比仅使用简单的for循环更好。 试一下吧。

def list_map(string_val,float_val):
    return [string_val,float_val]

def string_spliter(list_1):
    string_form=[]
    float_form=[]
    
    for string in list_1:
        str_val,float_val=string.split(";")
        string_form.append(str_val)
        float_form.append(float_val)
    return string_form,float_form

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']
    
string_form,float_form=string_spliter(list_1)
float_form=list(map(float,float_form))
output=list(map(list_map,string_form,float_form))

print(output)

0
对于这样的问题,您可以初始化两个变量来存储调用分割函数的结果,然后将两个值的列表附加在一起,并在第二个值上调用内置的float函数。
array = []
for i in a_list:
    string, number = i.split(";")
    array.append([string, float(number)])

print(array)

“array” 可能是一个误导性的名称,因为这个值其实是一个 “list”。 - Chris

0

你创建list_2的方式很好。要创建新列表,可以使用final_list = [[i[0], float(i[1])] for i in list_2]

你也可以在for循环中这样做:

for item in list_1:
  split_item = item.split(';')
  list_2.append([split_item[0], float(split_item[1])])

0

使用列表推导式可以在两行代码中实现此目标。

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']
list_2 = [[a, float(b)] for x in list_1 for a, b in [x.split(';', 1)]]

列表推导式的第二个“维度”生成一个只有一个子列表的列表。这样我们就可以将每个项拆分的结果保存下来,然后将这两个项绑定到ab中,以使使用它们更加清晰,而不必指定索引。

注意:通过使用第二个参数为1调用split,我们确保字符串最多只被拆分一次。


0
你可以使用函数映射来转换每个值。
def modify_element(el): 
    name, value = el.split(';')
    return [name, float(value)]

list_1 = ['chocolate;1.20', 'book;5.50', 'hat;3.25']

result = list(map(modify_element, list_1))

由于对list_1的操作很简单,列表推导式提供了一种Pythonic的单行声明选项,应该使用它。 - Chris

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