我想转换以下字符串:
s = '1|2|a|b'
到
[1, 2, 'a', 'b']
是否可以在一行中进行转换?
答案 0 :(得分:10)
是否可以在一行中进行转换?
是,有可能。但是如何?
方法的算法
使用str.split
将字符串拆分为其组成部分。输出是
>>> s = '1|2|a|b'
>>> s.split('|')
['1', '2', 'a', 'b']
现在我们遇到了一半问题。接下来,我们需要循环遍历拆分字符串,然后检查它们中的每一个是字符串还是int。为此,我们使用
str.isdigit
用于查找元素是int
还是str
。 列表理解可以很容易地写成[i for i in s.split('|')]
。但是我们如何在那里添加if
条款呢? One-line list comprehension: if-else variants中介绍了这一点。既然我们知道哪些元素都是int
而哪些元素不是,我们就可以轻松地在其上调用内置int
。
因此最终的代码看起来像
[int(i) if i.isdigit() else i for i in s.split('|')]
现在进行一个小型演示,
>>> s = '1|2|a|b'
>>> [int(i) if i.isdigit() else i for i in s.split('|')]
[1, 2, 'a', 'b']
正如我们所看到的,输出是预期的。
请注意,如果要转换的类型很多,则此方法不适用。
答案 1 :(得分:4)
您不能在一行中为负数或大量混合类型执行此操作,但您可以使用可使用ast.literal_eval
的多种类型的函数:
from ast import literal_eval
def f(s, delim):
for ele in s.split(delim):
try:
yield literal_eval(ele)
except ValueError:
yield ele
s = '1|-2|a|b|3.4'
print(list(f(s,"|")))
[1, -2, 'a', 'b', 3.4]
答案 2 :(得分:1)
如果允许辅助函数,则可以“在一行中”进行任意多次或复杂的转换。 Python本身没有“将此字符串转换为它应该表示的类型”函数,因为它“应该”表示的是模糊的,可能会因应用程序而异。
for(j = (5-i+1);j >= 1;j--)
答案 3 :(得分:1)
另一种方法是使用map
内置方法:
>>> s='1|2|a|b'
>>> l = map(lambda x: int(x) if x.isdigit() else x, s.split('|'))
>>> l
[1, 2, 'a', 'b']
如果是Python3,那么:
>>> s='1|2|a|b'
>>> l = list(map(lambda x: int(x) if x.isdigit() else x, s.split('|')))
>>> l
[1, 2, 'a', 'b']
由于Python3中的map
会提供生成器,因此您必须将其转换为list
答案 4 :(得分:1)
如果您拥有各种数据类型(超过str和int),我相信这可以胜任。
s = '1|2|a|b|[1, 2, 3]|(1, 2, 3)'
print [eval(x) if not x.isalpha() else x for x in s.split("|")]
# [1, 2, 'a', 'b', [1, 2, 3], (1, 2, 3)]
如果存在" b1"
等元素,则会失败