将字符串拆分为各种数据类型

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.为此,我们使用

  • 列表理解可以很容易地写成[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)

我们可以看到,输出是预期的.


请注意,如果要转换的类型很多,则此方法不适用.


Pad*_*ham 5

您不能在一行中对负数或许多混合类型执行此操作,但可以使用适用于多种类型的函数,方法是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)