我有一个类似于这样的连接字符串:
my_str = 'str1;str2;str3;'
我想对它应用 split
函数,然后将结果列表转换为元组,并且去掉由 split
产生的任何空字符串(注意结尾处的最后一个 ';')。
到目前为止,我正在执行以下操作:
tuple(filter(None, my_str.split(';')))
有没有更高效(从速度和空间方面考虑)的方法来完成这件事?
这个怎么样?
tuple(my_str.split(';')[:-1])
('str1', 'str2', 'str3')
你可以在字符串中的 ;
字符处分割它,并将所有子字符串(除了最后一个空字符串)传递给元组以创建结果元组。这是一种非常合理的做法。还有一些备选方案:
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
;
,你也可以使用 str.rstrip()
。 - Sven Marnachstrip
会将它们从两端删除。 - David Wolevera = 'str1;str2;str3;'
tuple(a.split(';')[:-1])
tuple(a[:-1].split(';'))
tuple(my_str.split(';')[:-1])
代码。是的,这是一种相当Pythonic的方法。如果您喜欢生成器表达式,也可以使用以下内容替换filter()
:
tuple(part for part in my_str.split(';') if part)
这样做的好处是可以在每个部分内联进行进一步处理。
有趣的是,str.split()
的文档中写道:
... 如果未指定sep或为None,则任何空格字符串都是分隔符并且从结果中删除空字符串。
我想知道为什么要特殊处理这种情况,而不允许其他分隔符也这样做...
(str1, str2, str3) = my_str.split(";")
更多相关内容请参考这里:https://blog.teclado.com/destructuring-in-python/
使用split函数,然后进行切片操作:
my_str.split(';')[:-1]
或者:
lis=[x for x in my_str.split(';') if x]
我知道这是一个老问题,但我刚刚看到最佳答案(David)没有像OP请求的那样返回元组。虽然该解决方案适用于OP给出的一个示例,但得票最高的答案(Levon)使用子字符串剥离尾随分号,这将在空字符串上出错。
最健壮和Pythonic的解决方案是voithos的答案:
tuple(part for part in my_str.split(';') if part)
这是我的解决方案:
tuple(my_str.strip(';').split(';'))
但是,当针对空字符串运行时,它会返回这个:
('',)
所以我将用voithos的答案替换我的答案。谢谢voithos!
;
而出现,还是列表中间可能存在空字符串?str.split()
返回的列表就可以了。