如何交替穿插来自两个不同字符串的字符以形成一个字符串

How to intersperse characters from two different strings alternatively to form a string

方法一:

    abc = 'Hello World'
    qwe = 'abc 123'
    
    #intersperse words
    def intersperse(abc,qwe):
        list = []
        for i in abc:
            list.append(i)
            for j in qwe:
                list.append(j)
        return ''.join(list)
    
    intersperse(abc,qwe)

Output: "Habc 123eabc 123labc 123labc 123oabc 123 abc 123Wabc 123oabc 123rabc 123labc 123dabc 123"

方法二:

    #intersperse words
    def intersperse(abc,qwe):
        abcs = abc.split()
        qwes = qwe.split()
        result = sum(zip(abcs, qwes+[0]), ())[:-1]
        return ''.join(result)
    
    intersperse(abc,qwe)

Output: "HelloabcWorld" (<--somehow the 123 is missing)

这两种方法都试过了,但无法正常工作。我希望输出也考虑字符之间的空格。

所需输出:“Haeblcl o1 2W3orld”

列表推导式中的简单 for 循环可以缩短问题吗?

def intersperse(abc,qwe):
    min_len = min(len(abc), len(qwe))
    return "".join([abc[i] + qwe[i] for i in range(min_len)]) + abc[min_len:] + qwe[min_len:]

解释:确定两个字符串的最小长度——直到该长度,交替添加两个字符串的字符。最后,利用切片添加较长字符串的剩余字符。

输出符合预期:intersperse("Hello World", "abc 123") 产生 'Haeblcl o1 2W3orld'

您可以使用 itertools zip_longest 并加入:

from itertools import zip_longest
abc = 'Hello World'
qwe = 'abc 123'
''.join(i+j for i, j in zip_longest(abc, qwe, fillvalue=''))

输出:

'Haeblcl o1 2W3orld'

使用 zip 和生成器表达式:

abc = 'Hello World'
qwe = 'abc 123'
min_len = min(len(abc), len(qwe))
print("".join(a+q for a,q in zip(abc, qwe)) + abc[min_len:] + qwe[min_len:])

(从@LMD 的回答中获取较长字符串结尾的代码)

from itertools import chain, zip_longest

''.join(filter(None, chain.from_iterable(zip_longest(abc, qwe))))

甚至

''.join(chain.from_iterable(zip_longest(abc, qwe, fillvalue='')))

fillvalue Talha Tayyab 在他们的回答中建议)

from itertools import zip_longest
''.join(''.join(x) for x in zip_longest(abc,qwe,fillvalue =''))

使用生成器函数很容易完成。

abc = 'Hello World'
qwe = 'abc 123'

def intersperce(a, b):
    if len(a) > len(b):
        filler = a[len(b):]
    else:
        filler = b[len(a):]

    def generator():
        for char_a, char_b in zip(a, b):
            yield char_a
            yield char_b
        for x in filler:
            yield x

    return "".join(generator())


assert intersperce(abc, qwe) == "Haeblcl o1 2W3orld"

yield returns 值并暂停执行。只需在 (a, b) 上迭代一个 zip,您就可以轻松地一次生成一个字符。然后只需要填写剩余的字符即可。

你可以参考official documentation一下!

编辑:

我不知道 zip_longest,谢谢@Nin17。这是一个不需要填充物的较短版本。

from itertools import zip_longest

abc = 'Hello World'
qwe = 'abc 123'

def intersperce(a, b):

    def generator():
        for char_a, char_b in zip_longest(a, b, fillvalue=""):
            yield char_a
            yield char_b

    return "".join(generator())


assert intersperce(abc, qwe) == "Haeblcl o1 2W3orld"

这让我找到代码高尔夫版本

from itertools import zip_longest

abc = 'Hello World'
qwe = 'abc 123'


def intersperce(a, b):
    return "".join(i + j for i, j in zip_longest(a, b, fillvalue=""))


assert intersperce(abc, qwe) == "Haeblcl o1 2W3orld"