删除列表中的单引号,拆分字符串避免引号

remove single quotes in list, split string avoiding the quotes

是否可以拆分字符串并避免引号(单引号)?

我想从列表中删除单引号(保留列表、字符串和浮点数:

l=['1','2','3','4.5']

期望的输出:

l=[1, 2, 3, 4.5]

下一行既不适用于 int 也不适用于 float

l=[float(value) for value in ll]

引号不是列表中字符串的一部分,因此无法删除它们。输出显示列表元素周围的引号,表明您正在处理字符串。

您可以使用

将列表 ['1','2','3','4.5'] 中的所有项目转换为浮点数
>>> l = ['1','2','3','4.5']
>>> [float(x) for x in l]
[1.0, 2.0, 3.0, 4.5]

>>> map(float, l)
[1.0, 2.0, 3.0, 4.5]

但是,这不是 "removing the quotes" 来自您的列表项,而是将您的字符串列表转换为浮点数列表。打印时,浮点数不会显示在它们周围的引号中,因为它们不是字符串。

根据每个值的样子得到intfloat,所以'1'变成1"1.2"变成1.2 ,您可以 use ast.literal_eval 以与 Python 的文字解析器相同的方式进行转换,因此您拥有 intfloat 的实际 list,而不是比 strlist (回显时会包括引号):

>>> import ast
>>> [ast.literal_eval(x) for x in l]
[1, 2, 3, 4.5]

与普通 eval 不同,这不会打开安全漏洞,因为它无法执行任意代码。

你可以在这里使用 map 来获得温和的性能提升(因为 ast.literal_eval 是用 C 语言实现的内置函数;通常,map 对列表推导式的增益很小或丢失),在 Py 2 中,map(ast.literal_eval, l) 或 Py3(其中 map returns 生成器,而不是 list),list(map(ast.literal_eval, l))

如果目标纯粹是显示不带引号的字符串,您只需手动格式化并完全避免类型转换:

>>> print('[{}]'.format(', '.join(l)))
[1, 2, 3, 4.5]

你的下一行不起作用的原因是你有一个 ll 而不是 l

['1','2','3','4.5']

print([int(i) if float(i) % 1 == 0 else float(i) for i in l])

>>> [1, 2, 3, 4, 4.5]