我有一个这样的连接字符串:
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
:
在 [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
如果您只希望最后有一个空字符串,您可以这样做:
a = '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 未指定或为无,则任何空白字符串都是分隔符,并且从结果中删除空字符串。
我想知道为什么要完成这种特殊情况,而不允许其他分隔符使用它...
使用拆分然后切片:
my_str.split(';')[:-1]
或者 :
lis=[x for x in my_str.split(';') if x]
如果您的字符串中的项目数是固定的,您也可以像这样解构内联:
(str1, str2, str3) = my_str.split(";")
我知道这是一个老问题,但我刚发现这个问题,发现最佳答案(大卫)没有像 OP 要求的那样返回元组。尽管该解决方案适用于 OP 给出的一个示例,但投票率最高的答案 (Levon) 会用子字符串去除尾随分号,这会在空字符串上出错。
最强大和 Pythonic 的解决方案是 voithos 的回答:
tuple(part for part in my_str.split(';') if part)
这是我的解决方案:
tuple(my_str.strip(';').split(';'))
但是,当针对空字符串运行时,它会返回:
('',)
所以我会用voithos的回答代替我的。谢谢voithos!