将连接字符串拆分为元组并忽略空字符串的最快方法

时间:2012-06-12 16:56:32

标签: python split

我有一个这样的串联字符串:

my_str = 'str1;str2;str3;'

我希望将split函数应用于它,然后将结果列表转换为元组,并删除split产生的任何空字符串(注意最后一个';'in结束)

到目前为止,我这样做了:

tuple(filter(None, my_str.split(';')))

是否有更高效(在速度和空间方面)的方法呢?

8 个答案:

答案 0 :(得分:12)

这个怎么样?

    tuple(my_str.split(';')[:-1])
    ('str1', 'str2', 'str3')

您将字符串拆分为;字符,并将所有子字符串(除了最后一个,空字符串除外)传递给元组以创建结果元组。

答案 1 :(得分:8)

这是一种非常合理的方法。一些替代方案:

  • foo.strip(";").split(";")(如果字符串中没有任何空切片)
  • [ x.strip() for x in foo.split(";") if x.strip() ](从每个切片中去除空格)

“最快”的方法取决于很多事情......但你可以轻松地尝试ipython的%timeit

In [1]: foo = "1;2;3;4;"

In [2]: %timeit foo.strip(";").split(";")
1000000 loops, best of 3: 1.03 us per loop

In [3]: %timeit filter(None, foo.split(';'))
1000000 loops, best of 3: 1.55 us per loop

答案 2 :(得分:4)

如果你只想到最后一个空字符串,你可以这样做:

a = 'str1;str2;str3;'
tuple(a.split(';')[:-1])

tuple(a[:-1].split(';'))

答案 3 :(得分:4)

尝试tuple(my_str.split(';')[:-1])

答案 4 :(得分:2)

是的,这是一种非常好的Pythonic方式。如果您喜欢生成器表达式,还可以将filter()替换为:

tuple(part for part in my_str.split(';') if part)

这样可以允许在线对每个部分进行进一步处理。

值得注意的是,str.split()的文档说:

  

...如果未指定sep或为None,则任何空格字符串为a   分隔符和空字符串将从结果中删除

我想知道为什么这个特殊情况已经完成,而不允许它用于其他分隔符......

答案 5 :(得分:1)

使用拆分然后切片:

 my_str.split(';')[:-1]

或:

lis=[x for x in my_str.split(';') if x]

答案 6 :(得分:1)

如果你的字符串中的项目数是固定的,你也可以像这样解构内联:

(str1, str2, str3) = my_str.split(";")

更多关于这里: https://blog.teclado.com/destructuring-in-python/

答案 7 :(得分:0)

我知道这是一个古老的问题,但是我刚遇到这个问题,就看到最高答案(David)不会返回像OP请求的元组。尽管该解决方案适用于OP给出的一个示例,但投票最高的答案(Levon)用子字符串剥离结尾的分号,这在空字符串上会出错。

最健壮和pythonic解决方案是voithos的答案:

tuple(part for part in my_str.split(';') if part) 

这是我的解决方法:

tuple(my_str.strip(';').split(';'))

但是在针对空字符串运行时会返回此值:

('',)

所以我将用voithos的答案代替我的。谢谢voithos!