Python3字符串 "abcd" 打印:aababcabcd?

4

如果我有一个字符串,比如abcd或者1234等等,我该怎么样把它们连在一起打印出来呢?

例如,对于一个string = 1234,我想要打印/返回1121231234aababcabcd

我目前有这段代码:

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自动处理呢?因为我不知道字符串有多长。

3个回答

6

您不应该将 str 作为变量名,因为它会掩盖 内置的str类型。您可以在循环中将切片后的字符串连接起来:

def string_splosion(string):
    i, result = 0, ''
    while i < len(string): # < instead of <=
        i += 1
        result += string[:i]
    return result

使用 str.joinrange 可以稍微缩短您的代码:

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 方法快约 2 倍,比基于循环的原始解决方案快约 1.5 倍:

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)))

你对于字符串名称的理解是正确的,但这就是练习中使用的。我通常在编写代码时将其更改为x或其他内容,然后再改回来(在CodingBat上工作)。 你的第二行代码:i,result = o,'' 我假设''是相同的(i是0,''也是相同的)。 - AL12
使用range(1,len(string)+1)可以在列表推导式中去除循环(建议解决方案2),但这可能是无用的。 - gboffi
@AL12,抱歉我不太明白。i, result = 1, ''将空字符串赋值给result变量,将整数值1赋值给i变量。这被称为序列解包赋值 - vaultah

4

只需使用:

"".join([s[:i] for i in range(len(s)+1)])

正如@abc所指出的,不要使用str作为变量名,因为它是默认类型之一。请参见https://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange

例如:

>>> s = "1234"
>>> "".join([s[:i] for i in range(len(s)+1)])
'1121231234'
>>> s = "abcd"
>>> "".join([s[:i] for i in range(len(s)+1)])
'aababcabcd'

range(len(s)+1)是因为切片操作,详见解释Python的切片操作

>>> s = "1234"
>>> len(s)
4
>>> range(len(s))
[0, 1, 2, 3]
>>> s[:3]
'123'
>>> range(len(s)+1)
[0, 1, 2, 3, 4]
>>> s[:4]
'1234'

然后:
>>> s[:0]
''
>>> s[:1]
'1'
>>> s[:2]
'12'
>>> s[:3]
'123'
>>> s[:4]
'1234'

最后,使用"".join(list)list([s[:1], s[:2], s[:3], s[:4]])连接起来,详见https://docs.python.org/2/library/string.html#string.join
>>> list([s[:1], s[:2], s[:3], s[:4]])
['1', '12', '123', '1234']
>>> x = list([s[:1], s[:2], s[:3], s[:4]])
>>> "".join(x)
'1121231234'
>>> "-".join(x)
'1-12-123-1234'
>>> " ".join(x)
'1 12 123 1234'

为避免在循环中进行提取迭代,您可以使用range(1,len(s)+1),因为s[:0]返回长度为0的字符串:
>>> s = "1234"
>>> "".join([s[:i] for i in range(1,len(s)+1)])
'1121231234'
>>> "".join([s[:i] for i in range(len(s)+1)])
'1121231234'

在你的代码中:"".join([s[:i] for i in range(len(s)+1)]),开头的""是做什么用的? - AL12
更新了答案,希望 str.join() 的示例有所帮助。在我看来,当答案中出现 "see ..." 时,你也应该去查看文档。 - alvas

0
如果您正在使用Python 3,您可以使用以下代码在不换行的情况下打印输出:
print(yourString, end="")

所以你的函数可以是这样的:
def string_splosion(str):
    for i in range(len(str)):
        print(str[:i], end="")
print(string_splosion('abcd'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接