根据较长的字符串压缩字符串

Ran*_*dom 2 python string python-3.x

给出2个字符串:

a='AAAAAAAA'
b='GGGG'
Run Code Online (Sandbox Code Playgroud)

我想得到一个结果

'AG','AG','AG','AG','A','A','A','A'
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试了两种方法,它们都只返回了4个项目

地图方法:

list(map(lambda x,y:x+y,a,b))
Run Code Online (Sandbox Code Playgroud)

结果:

'AG','AG','AG','AG'
Run Code Online (Sandbox Code Playgroud)

拉链方式:

list(zip(a,b))
Run Code Online (Sandbox Code Playgroud)

结果:

('A','G'),('A','G'),('A','G'),('A','G')
Run Code Online (Sandbox Code Playgroud)

Map方法看起来更接近我正在寻找的东西

Kas*_*mvd 6

您可以使用itertools.zip_longest哪个接受fillvalue参数:

>>> from itertools import zip_longest
>>> a='AAAAAAAA'
>>> b='GGGG'

>>> [''.join(i) for i in zip_longest(a,b,fillvalue='')]
['AG', 'AG', 'AG', 'AG', 'A', 'A', 'A', 'A']
Run Code Online (Sandbox Code Playgroud)

如果你想在不导入库的情况下执行此操作,可以查看zip_longest源代码.您可能会注意到这是执行此类任务的最pythonic方式.

顺便说一下,你可以使用另一种非pythonic和高效的方法,例如你可以使用atr.ljust填充b特殊字符并使其大小相等a然后压缩它们并使用列表理解来获得预期的输出:

>>> [''.join((i,j)) if j != '.' else i for i,j in zip(a,b.ljust(len(a),'.'))]
['AG', 'AG', 'AG', 'AG', 'A', 'A', 'A', 'A']
Run Code Online (Sandbox Code Playgroud)