Python在X位置合并字符串

Python在X位置合并字符串,python,string,merge,Python,String,Merge,我正在研究一些ASCII艺术,但我有一个子问题。我想把两个字符串合并在一起创建一个更大的字符串,但我想合并字符串,这样每隔一个字母合并一次,剩下的就留在原来的位置。因此,如果我有字符串“home”和“sweet”,我希望输出是“hsowmeet”;或者一个更长的合并,与我打算做的ASCII艺术一样,^^和&&&&&&将合并到^&^&&&& 我知道我走了,但我开始做这样的事情: def merge(s1, s2): new = s1[1:2] + s2[1:2] + s1[2:2] + s2[

我正在研究一些ASCII艺术,但我有一个子问题。我想把两个字符串合并在一起创建一个更大的字符串,但我想合并字符串,这样每隔一个字母合并一次,剩下的就留在原来的位置。因此,如果我有字符串
“home”
“sweet”
,我希望输出是
“hsowmeet”
;或者一个更长的合并,与我打算做的ASCII艺术一样,
^^
&&&&&&
将合并到
^&^&&&&

我知道我走了,但我开始做这样的事情:

def merge(s1, s2):
  new = s1[1:2] + s2[1:2] + s1[2:2] + s2[2:2]
  return new

但到目前为止,它看起来很难看,没有达到我想要的效果

你可以使用
zip\u

from itertools import zip_longest

a = "^^^"
b = "&&&&&&"

def merge(a, b)
    return "".join((x+y for (x, y) in zip_longest(a, b, fillvalue="")))

merge(a, b) # '^&^&^&&&&'

您可以对
fillvalue
关键字参数使用
itertools.izip_longest
和空字符串,然后按摩返回值,直到它成为您想要的字符串

以下是izip_longest产生的输出(我将结果列成一个列表,以便可读):

现在您只需连接所有字符串(长度为1或0)。一个解决办法是

>>> ''.join(sum(izip_longest(s1, s2, fillvalue=''), ()))
'hsowmeeet'
或者,只需使用常规的
for
循环:

>>> result = ''
>>> for x,y in izip_longest(s1, s2, fillvalue=''):
...     result += x + y
... 
>>> result
'hsowmeeet'
示例:

>>> merge_words('abc', '123456789')
'a1b2c3456789'
>>> merge_words('red', 'rover')
'rreodver'
>>> merge_words('Python', 'merging', 'strings')
'Pmsyettrrhgioinnnggs'

注意:如果使用Python2将
zip_longest
更改为其旧名称
izip_longest

,则可以使用
itertools

from itertools import izip_longest

def merge(s1, s2):
    return ''.join([i+j for i,j in izip_longest(s1, s2, fillvalue='')])

在Python3.x中,它是
zip_longest
,而不是
izip_longest

使用
sum
或使用重复的
+=
构建字符串在创建最终结果之前创建大量中间和更大的对象。对于像这样的小任务来说,这可能没什么大不了的,但值得指出的是,该算法的效率比它需要的要低。
>>> merge_words('abc', '123456789')
'a1b2c3456789'
>>> merge_words('red', 'rover')
'rreodver'
>>> merge_words('Python', 'merging', 'strings')
'Pmsyettrrhgioinnnggs'
from itertools import izip_longest

def merge(s1, s2):
    return ''.join([i+j for i,j in izip_longest(s1, s2, fillvalue='')])