我想转换以下字符串:
s = '1|2|a|b'
至
[1, 2, 'a', 'b']
是否可以在一行中进行转换?
是否可以在一行中进行转换?
是的,有可能.但是怎么样?
该方法的算法
使用将字符串拆分为其组成部分str.split
.这个的输出是
>>> s = '1|2|a|b' >>> s.split('|') ['1', '2', 'a', 'b']
现在我们有一半的问题.接下来,我们需要循环遍历拆分字符串,然后检查它们中的每一个是字符串还是int.为此,我们使用
一个列表的理解,这对循环部分
str.isdigit
用于查找元素是a int
还是a str
.
列表理解可以很容易地写成[i for i in s.split('|')]
.但是我们如何在那里添加一个if
条款呢?这在单行列表理解中有所介绍:if-else变体.现在我们知道哪些元素都是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']
我们可以看到,输出是预期的.
请注意,如果要转换的类型很多,则此方法不适用.
您不能在一行中对负数或许多混合类型执行此操作,但可以使用适用于多种类型的函数,方法是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]