在Python中交织两个多行字符串

时间:2018-11-06 20:39:28

标签: python string

除了Python,我想做this post中的所有事情。考虑两个字符串:

s1='AAA1
    AAA2
    AAA3'
s2='BBB1
    BBB2
    BBB3'

我想让combine(s1,s2)返回:

s3='AAA1BBB1
    AAA2BBB2
    AAA3BBB3'

您可能会认为这些字符串实际上很长,我希望此过程能够有效执行。如果您能帮助我知道该怎么做,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

在Python中,多行字符串用'''表示。

>>> s1 = '''AAA1
...:AAA2
...:AAA3'''
>>> 
>>> s2 = '''BBB1
...:BBB2
...:BBB3'''

您可以用str.splitlines拆分它们,并用zip交错它们。

>>> strings = [s1, s2]
>>> pairs = zip(*(s.splitlines() for s in strings))
>>> result = '\n'.join(''.join(pair) for pair in pairs)
>>> 
>>> print(result)
AAA1BBB1
AAA2BBB2
AAA3BBB3

使用*args语法接受任意数量的多行字符串的通用函数可以编写如下。

>>> def combine(*strings):
...:    lines = zip(*(s.splitlines() for s in strings))
...:    return '\n'.join(''.join(line) for line in lines)
>>> 
>>> str1 = '''A
...:D
...:H'''
>>> str2 = '''B
...:E
...:I'''
>>> str3 = '''C
...:F
...:J'''
>>> 
>>> print(combine(str1, str2, str3))
ABC
DEF
HIJ

请注意,zip会截断其产生的可迭代项,直到其最短参数的长度,即结果的行数与传递给combine的最短多行字符串的行数相同。

如果您期望使用不同行数的字符串并且需要填充值,则可以在itertools模块中使用zip_longest

答案 1 :(得分:1)

如果涉及换行符,这可能会满足您的要求:

s1="AAA1\nAAA2\nAAA3"
s2="BBB1\nBBB2\nBBB3"

ms1 = s1.splitlines()
ms2 = s2.splitlines()

new_list = []

i = 0
while i < 3:
  new_list.append( ms1[i]+ms2[i] )
  i = i + 1

print(new_list)

答案 2 :(得分:1)

同时使用splitlines()zip两个列表

s1="AAA1\nAAA2\nAAA3"
s2="BBB1\nBBB2\nBBB3"

l1 = s1.splitlines()
l2 = s2.splitlines()

print('\n'.join([i+j for i,j in zip(l1,l2)]))

输出

AAA1BBB1
AAA2BBB2
AAA3BBB3