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

28

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

my_str = 'str1;str2;str3;'

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

到目前为止,我正在执行以下操作:

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

有没有更高效(从速度和空间方面考虑)的方法来完成这件事?


@Levon,我明白了,抱歉,我只是匆忙中选择了一个示例变量名称。谢谢。 - MLister
1
请解释一下您所说的“更好”是什么意思。 - NPE
  1. 空段落只会因为末尾有额外的 ; 而出现,还是列表中间可能存在空字符串?
  2. 为什么要将结果转换为元组?通常,直接使用 str.split() 返回的列表就可以了。
- Sven Marnach
4
根据你所应用的数据集不同,很可能你会在这个问题上花费更多时间——撰写它、阅读回复等等——而节省下来的运行时间却比最快与最慢方法之间的差异要少。至少有一半的“最快方式”Python问题都是如此。 - DSM
@Levon,实际使用情况是在任何给定的服务器请求中,我需要处理大约200个它们,如果这有任何区别的话。 - MLister
显示剩余4条评论
8个回答

20

这个怎么样?

tuple(my_str.split(';')[:-1])
('str1', 'str2', 'str3')
你可以在字符串中的 ; 字符处分割它,并将所有子字符串(除了最后一个空字符串)传递给元组以创建结果元组。

13

这是一种非常合理的做法。还有一些备选方案:

  • 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

1
如果这只是关于尾随的 ;,你也可以使用 str.rstrip() - Sven Marnach
没错,strip会将它们从两端删除。 - David Wolever

4
如果你只期望在最后得到一个空字符串,你可以这样做:
a = 'str1;str2;str3;'
tuple(a.split(';')[:-1])

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

3
尝试使用tuple(my_str.split(';')[:-1])代码。

2

是的,这是一种相当Pythonic的方法。如果您喜欢生成器表达式,也可以使用以下内容替换filter()

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

这样做的好处是可以在每个部分内联进行进一步处理。

有趣的是,str.split() 的文档中写道:

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

我想知道为什么要特殊处理这种情况,而不允许其他分隔符也这样做...


2

1

使用split函数,然后进行切片操作:

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

或者:

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

我认为 OP 想要一个元组作为结果,而不是一个列表。 - Levon

0

我知道这是一个老问题,但我刚刚看到最佳答案(David)没有像OP请求的那样返回元组。虽然该解决方案适用于OP给出的一个示例,但得票最高的答案(Levon)使用子字符串剥离尾随分号,这将在空字符串上出错。

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

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

这是我的解决方案:

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

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

('',)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接