将字符串列表转换为整数或浮点数

5

我有一个列表,大致长这样:

['1', '2', '3.4', '5.6', '7.8']

我该如何把前两个改为int类型,后三个改为float类型?

我希望我的列表看起来像这样:

[1, 2, 3.4, 5.6, 7.8]
6个回答

15

在列表推导式中使用条件语句conditional inside a list comprehension

>>> s = ['1', '2', '3.4', '5.6', '7.8']
>>> [float(i) if '.' in i else int(i) for i in s]
[1, 2, 3.4, 5.6, 7.8]

指数函数的有趣边界条件。你可以在条件中添加。

>>> s = ['1', '2', '3.4', '5.6', '7.8' , '1e2']
>>> [float(i) if '.' in i or 'e' in i else int(i) for i in s]
[1, 2, 3.4, 5.6, 7.8, 100.0]

使用isdigit是最好的,因为它处理了所有边缘情况(在Steven评论中提到)。

>>> s = ['1', '2', '3.4', '5.6', '7.8']
>>> [int(i) if i.isdigit() else float(i) for i in s]
[1, 2, 3.4, 5.6, 7.8, 100.0]

2
由于 int("1e2") - Cong Ma
2
不同的条件语句可以解决Cong Ma的问题:int(i) if i.isdigit() else float(i) - Steven Rumbalski
1
@CongMa:虽然使用int(“1e2”)会失败,但我认为这并不值得被踩。虽然值得注意,但我认为它超出了问题规范的范围。 - Steven Rumbalski
在Python代码中,LBYL必须被认为是有害的,除非另有证明。 - Cong Ma
5
@CongMa 什么?那太荒谬了。 - Adam Smith

6

使用辅助函数:

def int_or_float(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

然后使用列表推导式来应用该函数:
[int_or_float(el) for el in lst] 

6
为什么不使用 ast.literal_eval
import ast

[ast.literal_eval(el) for el in lst]

应处理所有边界情况。对于这种用例来说,它有点笨重,但如果你希望在列表中处理任何类似数字的字符串,那么这将能够胜任。


1
使用字符串的 isdigit 方法:
numbers = [int(s) if s.isdigit() else float(s) for s in numbers]

或者使用地图:

numbers = map(lambda x: int(x) if x.isdigit() else float(x), numbers)

1
def st_t_onumber(x):
    import numbers
    # if any number
    if isinstance(x,numbers.Number):
        return x
    # if non a number try convert string to float or it
    for type_ in (int, float):
        try:
            return type_(x)
        except ValueError:
            continue

l = ['1', '2', '3.4', '5.6', '7.8']

li = [ st_t_onumber(x) for x in l]

print(li)

[1, 2, 3.4, 5.6, 7.8]

0
如果您想要显示相同的列表,请使用以下查询附加列表:
item = input("Enter your Item to the List: ")
shopList.append(int(item) if item.isdigit() else float(item))

当用户输入整数值或浮点数值时,它会将其附加到列表shopList中并将这些值存储在其中。


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