如何在Python中将字符串转换为数字?

3

我有一串数字作为字符串

li = ['1', '4', '8.6']

如果我使用 int 进行转换,结果将会是 [1, 4, 8]。 如果我使用 float 进行转换,结果将会是 [1.0, 4.0, 8.6]

我想要将它们转换成 [1, 4, 8.6]

我尝试了这个方法:

li = [1, 4, 8.6]
intli = list(map(lambda x: int(x),li))
floatli = list(map(lambda x: float(x),li))
print(intli)
print(floatli)

>> [1, 4, 8]
>> [1.0, 4.0, 8.6]

你们计划也支持负数吗?例如 ['-5', '-8.3'] - gog
是的,它应该接受负数。 - kabil
5个回答

8
如果isdigit()返回True,将项目转换为整数,否则转换为浮点数。这可以通过列表生成器完成:
li = ['1', '4', '8.6']
lst = [int(x) if x.isdigit() else float(x) for x in li]
print(lst)

为了检查它是否有效,您可以使用另一个列表生成器检查类型:

types = [type(i) for i in lst]
print(types)

投票支持,因为这是一个好答案,但如果有负整数,则会转换为负浮点数。 - Muhammad Akhlaq Mahar
1
不幸的是,isdigit 匹配的远不止 0..9 - gog

1
你可以使用ast.literal_eval将字符串转换为字面值:
from ast import literal_eval

li = ['1', '4', '8.6']
numbers = list(map(literal_eval, li))

正如Muhammad Akhlaq Mahar在评论中指出的那样,str.isidigit对于负整数不会返回True

>>> '-3'.isdigit()
False

0

一种方法是使用ast.literal_eval

>>> from ast import literal_eval
>>> spam = ['1', '4', '8.6']
>>> [literal_eval(item) for item in spam]
[1, 4, 8.6]

注意 - 有些值在使用str.isdigit()时会返回True,但无法转换为int或float,在使用literal_eval时会引发SyntaxError。

>>> '1²'.isdigit()
True

0
你需要一个小实用函数:
def to_float_or_int(s):
    n = float(s)
    return int(n) if n.is_integer() else n

那么,

result = [to_float_or_int(s) for s in li]

0
你可以尝试使用json中的loads函数对每个元素进行映射:

map

from json import loads
li = ['1', '4', '8.6']
li = [*map(loads,li)]
print(li)

# [1, 4, 8.6]

或者使用 eval() 函数:

print(li:=[*map(eval,['1','4','8.6','-1','-2.3'])])

# [1, 4, 8.6, -1, -2.3]

注意:

当要评估的字符串来自未知来源时,使用 json.loads()ast.literal_eval 比使用 eval() 更安全。


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