是否有一种简单而美观的方式将列表中的项目转换为不同类型?

时间:2017-08-16 13:23:09

标签: python

我从REST API获得了一个字符串列表。我从文档中知道索引0和2的项是整数,1和3的项是浮点数。

使用我需要将其转换为正确类型的数据进行任何类型的计算。虽然每次使用它们都可以投射值,但我更愿意在开始计算之前将列表转换为正确的类型,以保持方程式更清晰。下面的代码正在运行,但非常难看:

rest_response = ['23', '1.45', '1', '1.54']
first_int = int(rest_response[0])
first_float = float(rest_response[1])
second_int = int(rest_response[2])
second_float = float(rest_response[3])

由于我在这个特定的例子中使用整数和浮点数,一种可能的解决方案是将每个项目转换为浮点数。 float_response = map(float, rest_response)。然后我可以简单地解压缩列表,在方程式中相应地命名值。

first_int, first_float, second_int, second_float = float_response

这是我目前的解决方案(但是名字更好)但是当我想到这一点时,如果对这类问题有任何好的pythonic解决方案,我会变得好奇吗?

7 个答案:

答案 0 :(得分:15)

定义与您的类型转换匹配的第二个列表,将其与值列表一起压缩。

rest_response = ['23', '1.45', '1', '1,54']
casts = [int, float, int, float]
results = [cast(val) for cast, val in zip(casts, rest_response)]

答案 1 :(得分:5)

这是一个使用itertools.cycle来循环执行强制转换函数的解决方案:

from itertools import cycle

first_int, first_float, second_int, second_float = [cast(f)
    for f, cast in zip(rest_response, cycle((int, float)))]

答案 2 :(得分:2)

如果你知道你希望给出的类型,现有的答案是完美的。 但是,如果您事先不知道您的值是int还是float,那么您可以使用AST模块将字符串安全地解析为适当的类型:

import ast

然后,你打电话:

numbers = [ast.literal_eval(s) for s in strings]

答案 3 :(得分:1)

如果你的列表是其他所有模式,你可以使用modulo:

>>> [int(x) if i % 2==0 else float(x) for i,x in enumerate(rest_response)]
[23, 1.45, 1, 1.54]

或者,如果您想利用对命名变量的元组赋值,您可以按所需类型进行切片和映射:

first_int, second_int=map(int, rest_response[0::2])
first_float, second_float=map(float, rest_response[1::2])

答案 4 :(得分:0)

是的,鉴于所有都是字符串,只需编写一个正则表达式来检查,如果字符串有'。'在它,如果是的话,把它扔到浮动。否则为int

编辑:正则表达式是多余的,简单in string就足够了。

这就是我要做的事情:

import re

def convert_type(item):
    if re.match('^[^.]*$', item):
        item = int(item)
    else:
        item = float(item)
    return item

更简单的功能:

def convert_type(item):
    if '.' in item:
        return float(item)
    else:
        return int(item)

what = convert_type('2')
print(what, type(what))

convert_this = ['21.44', '12']

converted_list = list(map(convert_type, convert_this))
list(map(type, converted_list))

但我很高兴听到更简单,更直接的解决方案

答案 5 :(得分:0)

我认为尝试转换为int是合理的Pythonic,如果失败则使用float,

rest_response = ['23', '1.45', '1', '1.54']
float_response = []
for r in rest_response:

    try:
        float_response.append(int(r))
    except ValueError:
        float_response.append(float(r))

答案 6 :(得分:0)

在所有提供的解决方案中,您在问题中提供的解决方案是最好的。它具有速度和清晰度。

如果您想缩短所提供的解决方案,可以将其缩短为一行:

componentShouldUpdate

我不知道传入数据的所有可能格式,但如果浮点值始终具有小数,则另一种解决方案是:

first, second, third, fourth = int(lst[0]), float(lst[1]), int(lst[2]), float(lst[3])