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

时间:2015-09-18 06:46:09

标签: python string python-3.x

给出2个字符串:

a='AAAAAAAA'
b='GGGG'

我希望得到

的结果
'AG','AG','AG','AG','A','A','A','A'

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

地图方法:

list(map(lambda x,y:x+y,a,b))

结果:

'AG','AG','AG','AG'

Zip方法:

list(zip(a,b))

结果:

('A','G'),('A','G'),('A','G'),('A','G')

地图方法看起来更接近我正在寻找的

3 个答案:

答案 0 :(得分:6)

您可以使用接受fillvalue参数的itertools.zip_longest

>>> 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']

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

顺便说一下,您可以使用其他非pythonic和高效的方法,例如,您可以使用atr.ljust用特殊字符填充b并使其大小等于{{1}然后压缩它们并使用列表推导来获得预期的输出:

a

答案 1 :(得分:2)

然而,没有导入是一个奇怪的请求:

>>> a='AAAAAAAA'
>>> b='GGGG'
>>> [a[i: i + 1] + b[i: i + 1] for i in range(max(map(len, (a, b))))]
['AG', 'AG', 'AG', 'AG', 'A', 'A', 'A', 'A']

>>> [''.join(i) for i in zip(a, b)] + list(a[len(b):]) + list(b[len(a):])
['AG', 'AG', 'AG', 'AG', 'A', 'A', 'A', 'A']

导入itertools是一个更好的解决方案

答案 2 :(得分:0)

a='AAAAAAA'
b='GGGG'
listab=[] #declaring new list
for i in range(0,len(a)): #loops for length of a
    item = a[i:i+1] + b[i:i+1] #concatenates a letter from a and b
    listab.append(item) 
print (listab)
  1. 程序声明两个变量a和b。
  2. 声明一个空列表
  3. 假设变量(a)更长,启动一个for循环(如果需要,你总是可以写一个if语句来检查哪一个更长)
  4. for i in range(0,len(a))将整数i从0增加到(a)
  5. 的长度
  6. 然后在(a)和(b)中的相同位置添加字母,并附加到您创建的空列表中。
  7. string[start position: end position]返回字符串中起始位置和结束位置1之间的部分。