如何交替穿插来自两个不同字符串的字符以形成一个字符串
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"
方法一:
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"