如何在Python中将两个字符串压缩成一个新字符串

4

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

a = '12345'
b = 'abcdefgh'

我尝试使用zip(a,b),但它返回的是一个元组的列表,并且在字符串长度不相等时会截断:

[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', 'd'), ('5', 'e')]

我需要提取出新字符串。例如:

result = 1a2b3c4d5efgh

如何实现这一点?

你难道不能只使用一个for循环吗?从每个字符串的第0个位置开始,将每个字母添加到一个新的第三个字符串中。让i和k分别表示两个字符串的长度。 - user4669250
1个回答

6
一种可能的方法是将内部元组连接,然后再连接外部列表。
''.join(''.join(x) for x in zip(a,b))

虽然,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)

或者,如下所建议的Moinuddin,使用izip_longest

''.join(''.join(x) for x in izip_longest(a, b, fillvalue=''))

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


如何保留较大字符串中的剩余字符? - smitty
@smitty - 我编辑了答案。如果你想保留结尾,压缩不是正确的方法... - Pintun
2
@smitty 如果是这种情况,使用 itertools.izip_longest(),它将用 None 填充较小列表的值。 - Moinuddin Quadri

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