如何在python中将2个字符串压缩成一个新字符串

smi*_*tty 3 python string zip

我试图弄清楚如何将两个不同长度的字符串压缩成一个字符串,交替字符并将剩余的字符保留在较长的字符串中。例子:

a = '12345'
b = 'abcdefgh'
Run Code Online (Sandbox Code Playgroud)

我试过了,zip(a,b)但它返回一个元组列表,并在没有等长字符串时切断:

[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', 'd'), ('5', 'e')]
Run Code Online (Sandbox Code Playgroud)

我只需要取出新的字符串。例子:

result = 1a2b3c4d5efgh
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

Pin*_*tun 5

一种可能的方法:加入内部元组,然后加入外部列表。

''.join(''.join(x) for x in zip(a,b))
Run Code Online (Sandbox Code Playgroud)

虽然,zip()在最短的时间ab结束时将始终停止聚合(1a2b3c4d5e在您的示例中)。如果要到达最长输入字符串的末尾,则必须以不同方式迭代它们,例如:

c = [] 
for x in range(max(len(a),len(b))):
    c.append(a[x] if x < len(a) else '')
    c.append(b[x] if x < len(b) else '')
result=''.join(c)
Run Code Online (Sandbox Code Playgroud)

或者,按照下面 Moinuddin 的建议,使用izip_longest

''.join(''.join(x) for x in izip_longest(a, b, fillvalue=''))
Run Code Online (Sandbox Code Playgroud)

请注意,从 Python 3 开始,izip_longest()现在是zip_longest().

  • @smitty 在这种情况下,使用 `itertools.izip_longest()` 它将用 `None` 填充较小列表的值 (2认同)