我有一个这样的串联字符串:
my_str = 'str1;str2;str3;'
我希望将split
函数应用于它,然后将结果列表转换为元组,并删除split
产生的任何空字符串(注意最后一个';'in结束)
到目前为止,我这样做了:
tuple(filter(None, my_str.split(';')))
是否有更高效(在速度和空间方面)的方法呢?
答案 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(";")
答案 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!