21

我有一个这样的连接字符串:

my_str = 'str1;str2;str3;'

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

到目前为止,我正在这样做:

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

有没有更有效(在速度和空间方面)的方法来做到这一点?

4

8 回答 8

17

这个怎么样?

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

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

于 2012-06-12T17:03:12.753 回答
12

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

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

执行此操作的“最快”方法取决于很多事情……但是您可以轻松地尝试使用 ipython 的%timeit

在 [1] 中: foo = "1;2;3;4;"

在 [2] 中:%timeit foo.strip(";").split(";")
1000000 次循环,3 次中的最佳:每个循环 1.03 us

在 [3] 中:%timeit 过滤器(无,foo.split(';'))
1000000 个循环,3 个中最好的:每个循环 1.55 us
于 2012-06-12T16:59:39.933 回答
4

如果您只希望最后有一个空字符串,您可以这样做:

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

或者

tuple(a[:-1].split(';'))
于 2012-06-12T17:02:44.603 回答
3

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

于 2012-06-14T05:34:36.530 回答
2

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

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

这样做的好处是允许在线对每个零件进行进一步处理。

有趣的是,文档str.split()说:

... 如果 sep 未指定或为无,则任何空白字符串都是分隔符,并且从结果中删除空字符串

我想知道为什么要完成这种特殊情况,而不允许其他分隔符使用它...

于 2012-06-12T17:02:17.910 回答
1

使用拆分然后切片:

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

或者 :

lis=[x for x in my_str.split(';') if x]
于 2012-06-12T17:01:19.190 回答
1

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

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

更多信息在这里: https ://blog.teclado.com/destructuring-in-python/

于 2021-06-14T15:01:43.827 回答
0

我知道这是一个老问题,但我刚发现这个问题,发现最佳答案(大卫)没有像 OP 要求的那样返回元组。尽管该解决方案适用于 OP 给出的一个示例,但投票率最高的答案 (Levon) 会用子字符串去除尾随分号,这会在空字符串上出错。

最强大和 Pythonic 的解决方案是 voithos 的回答:

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

这是我的解决方案:

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

但是,当针对空字符串运行时,它会返回:

('',)

所以我会用voithos的回答代替我的。谢谢voithos!

于 2020-05-19T23:57:50.997 回答