当给出数据列表时,我被要求将列表中的字符串转换为相应的类型,如果字符串包含整数,则为int;如果不包含整数,则为float.但我遇到了这个问题,它将转换值,但它不会更改列表中的原始值.
例如,如果给出:
d = [['abc', '123', '45.6', 'True', 'False']]
它应该在转换后看起来像这样:
[['abc', 123, 45.6, True, False]]
到目前为止,我已经尝试编写for循环并以这种方式转换值,但正如我所提到的,它不会更改原始列表:
for lst in data:
for index in lst:
if index.isdigit():
index = int(index)
elif not index.isdigit():
index = float(index)
我不确定如何解决这个问题,或者是否还有另一种方法可以解决这个问题.任何帮助,将不胜感激!谢谢 :)
解决方法:
您需要使用列表订阅更新初始索引处的项目,即在转换项目后分配给每个索引.您可以使用enumerate执行此操作,该列表为列表中的每个项目提供相应的索引:
import ast
d = [['abc', '123', '45.6', 'True', 'False']]
for lst in d:
for i, x in enumerate(lst):
try:
lst[i] = ast.literal_eval(x)
except (ValueError, SyntaxError):
lst[i] = x
print(d)
# [['abc', 123, 45.6, True, False]]
ast.literal_eval尝试将每个字符串项解析为Python文字,如果失败(有错误),则恢复为原始项(参见EAFP).
如果你有大量的这些字符串,那么编写自己的解析器会更快(尽管代码更简洁,可能容易出错),但是,让ast.literal_eval完成所有脏工作可能会更好.
标签:python,python-3-x