wan*_*nik 3 python string list
我想转换以下字符串:
s = '1|2|a|b'
Run Code Online (Sandbox Code Playgroud)
至
[1, 2, 'a', 'b']
Run Code Online (Sandbox Code Playgroud)
是否可以在一行中进行转换?
Bha*_*Rao 10
是否可以在一行中进行转换?
是的,有可能.但是怎么样?
该方法的算法
使用将字符串拆分为其组成部分str.split.这个的输出是
>>> s = '1|2|a|b'
>>> s.split('|')
['1', '2', 'a', 'b']
Run Code Online (Sandbox Code Playgroud)现在我们有一半的问题.接下来,我们需要循环遍历拆分字符串,然后检查它们中的每一个是字符串还是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('|')]
Run Code Online (Sandbox Code Playgroud)现在进行一个小型演示,
>>> s = '1|2|a|b'
>>> [int(i) if i.isdigit() else i for i in s.split('|')]
[1, 2, 'a', 'b']
Run Code Online (Sandbox Code Playgroud)
我们可以看到,输出是预期的.
请注意,如果要转换的类型很多,则此方法不适用.
您不能在一行中对负数或许多混合类型执行此操作,但可以使用适用于多种类型的函数,方法是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]
Run Code Online (Sandbox Code Playgroud)