Python 将字符串与列表项合并-交替

Python 将字符串与列表项合并-交替,python,Python,因此,我试图“合并”一个字符串(a)和一个字符串列表(b): 要获得所需的输出(c): 所需输出字符串中的字符在字符串和列表之间按原点交替。此外,列表中包含的元素始终少于字符串中的字符数。我想知道最快的方法是什么 到目前为止,我掌握的情况如下: c = a[0] for i in range(len(b)): c += b[i] + a[1:][i] print(c) # prints -> 1+2-34 但是我觉得有一种更好的方法可以做到这一点。您可以使用压缩这两个序列,然后

因此,我试图“合并”一个字符串(
a
)和一个字符串列表(
b
):

要获得所需的输出(
c
):

所需输出字符串中的字符在字符串和列表之间按原点交替。此外,列表中包含的元素始终少于字符串中的字符数。我想知道最快的方法是什么

到目前为止,我掌握的情况如下:

c = a[0]
for i in range(len(b)):
    c += b[i] + a[1:][i]
print(c)  # prints -> 1+2-34
但是我觉得有一种更好的方法可以做到这一点。

您可以使用
压缩这两个序列,然后即使在较短的序列用完字符后仍继续迭代。如果您用完了字符,您将开始返回
None
,因此只需使用剩余的数字字符即可

>>> from itertools import chain
>>> from itertools import zip_longest
>>> ''.join(i+j if j else i for i,j in zip_longest(a, b))
'1+2-34'
根据注释中的建议,您还可以将
fillvalue
参数传递给
zip\u longest
,该参数将插入空字符串。我建议他的方法,因为它更具可读性

>>> ''.join(i+j for i,j in zip_longest(a, b, fillvalue=''))
'1+2-34'
建议的进一步优化是删除临时字符串连接(
i+j
),并用调用替换它们

>>> ''.join(chain.from_iterable(zip_longest(a, b, fillvalue='')))
'1+2-34'

或者
i+j表示i,j在zip中最长(a,b,fillvalue='')
。@deceze好建议!我编辑了我的帖子,加入了这个选项。谢谢你的回答和建议。使用这种方法是否只会提高可读性?因为它会检查条件语句,所以性能可能也会提高?不知道,我必须计时,但我怀疑条件时间可以忽略不计。只要您使用
itertools
,就可以避免genexpr(和大量临时的两个字符串),只需一次
join
;导入
chain
以及
zip\u longest
,它只是:
'.join(chain.from\u iterable(zip\u longest(a,b,fillvalue='')
链。from_iterable
有效地“展平”了
元组
s from
zip\u longest
,因此它只生成所有单个字符。将所有工作移到C层(在CPython引用解释器中),这更可能意味着性能提高。
>>> ''.join(i+j for i,j in zip_longest(a, b, fillvalue=''))
'1+2-34'
>>> ''.join(chain.from_iterable(zip_longest(a, b, fillvalue='')))
'1+2-34'