如果一个字符串如abcd
或1234
等,我如何一起打印第一个字符,然后是前两个字符,然后是前三个,等等。
例如对于string = 1234
我想打印/返回1121231234
或aababcabcd
到目前为止,我有以下代码:
def string_splosion(str):
i = 0
while i <= len(str):
i += 1
print(str[:i])
print(string_splosion('abcd'))
但是它在单独的行中打印/返回它。我可以手动编写它,print(str[0:1], str[1:2] <...>)
但是我不知道字符串将要持续多久,如何使python做到这一点呢?
您不应将其str
用作变量名,因为它会掩盖内置str
类型。您可以在循环中将切片的字符串连接在一起:
def string_splosion(string):
i, result = 0, ''
while i < len(string): # < instead of <=
i += 1
result += string[:i]
return result
def string_splosion(string):
return ''.join(string[:i] for i in range(1, len(string) + 1))
或使用itertools.accumulate
(Python 3.2+):
import itertools
def string_splosion(string):
return ''.join(itertools.accumulate(string))
itertools.accumulate
该方法似乎str.join
比原始的基于循环的解决方案快一倍,并且快两倍:
string_splosion_loop(abcdef): 2.3944241080715223
string_splosion_join_gen(abcdef): 2.757582983268288
string_splosion_join_lc(abcdef): 2.2879220573578865
string_splosion_itertools(abcdef): 1.1873638161591886
我用来计时功能的代码是
import itertools
from timeit import timeit
string = 'abcdef'
def string_splosion_loop():
i, result = 0, ''
while i < len(string):
i += 1
result += string[:i]
return result
def string_splosion_join_gen():
return ''.join(string[:i] for i in range(1, len(string) + 1))
def string_splosion_join_lc():
# str.join performs faster when the argument is a list
return ''.join([string[:i] for i in range(1, len(string) + 1)])
def string_splosion_itertools():
return ''.join(itertools.accumulate(string))
funcs = (string_splosion_loop, string_splosion_join_gen,
string_splosion_join_lc, string_splosion_itertools)
for f in funcs:
print('{.__name__}({}): {}'.format(f, string, timeit(f)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句