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

时间:2015-12-29 16:33:51

标签: python string list

我想转换以下字符串:

s = '1|2|a|b'

[1, 2, 'a', 'b']

是否可以在一行中进行转换?

5 个答案:

答案 0 :(得分:10)

  

是否可以在一行中进行转换?

,有可能。但是如何?

方法的算法

  • 使用str.split将字符串拆分为其组成部分。输出是

    >>> s = '1|2|a|b'
    >>> s.split('|')
    ['1', '2', 'a', 'b']
    
  • 现在我们遇到了一半问题。接下来,我们需要循环遍历拆分字符串,然后检查它们中的每一个是字符串还是int。为此,我们使用

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

等元素,则会失败