如果我有一个字符串:
“快速的棕色狐狸跳过懒狗!”我经常使用split()函数来标记字符串。
testString = "The quick brown fox jumps over the lazy dog!"
testTokens = testString.split(" ")
这会给我一个清单:
['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog!']
如果我想删除第一个令牌并保持令牌的REST完好无损,我会做这样的事情,使其成为一个单行:
newString = " ".join(testTokens.split(' ')[1:]) # "quick brown fox jumps over the lazy dog!"
或者,如果我想要某个范围:
newString = " ".join(testTokens.split(' ')[2:4]) # "brown fox"
newString = " ".join(testTokens.split(' ')[:3]) # "The quick brown"
当然,我可能想分开一个空间以外的东西:
testString = "So.long.and.thanks.for.all.the.fish!"
testTokens = testString.split('.')
newString = ".".join(testTokens.split('.')[3:]) # "thanks.for.all.the.fish!"
这是实现这一目标的最佳方法吗?或者是否有更高效或更易读的方式?
答案 0 :(得分:2)
请注意split
可以使用可选的第二个参数,表示应该进行的最大拆分数:
>>> testString.split(' ', 1)[1]
'quick brown fox jumps over the lazy dog!'
这比" ".join(testTokens.split(' ')[1:])
要好得多,只要它可以应用。
感谢@abarnert指出.split(' ', 1)[1]
如果没有空格则会引发异常。如果出现问题,请参阅partition
。
此外,还有rsplit
方法,因此您可以使用:
>>> testString.rsplit(' ', 6)[0]
'The quick brown'
而不是" ".join(testTokens.split(' ')[:3])
。
答案 1 :(得分:1)
您目前的方法非常好。通过限制分割数量可以获得非常轻微的性能提升。例如:
>>> ' '.join(testString.split(' ', 4)[2:4])
'brown fox'
>>> ' '.join(testString.split(' ', 3)[:3])
'The quick brown'
>>> ' '.join(testString.split(' ', 1)[1:])
'quick brown fox jumps over the lazy dog!'
请注意,对于较小的字符串,差异可以忽略不计,因此您应该坚持使用更简单的代码。以下是最小时序差异的示例:
In [2]: %timeit ' '.join(testString.split(' ', 4)[2:4])
1000000 loops, best of 3: 752 ns per loop
In [3]: %timeit ' '.join(testString.split(' ')[2:4])
1000000 loops, best of 3: 886 ns per loop