如何完成两个字符串的合并?
例如,您可能希望组合两个多行字符串来制作ASCII艺术。
HEAD = \
"""
O
"""
BODY = \
r"""
/|\
/ \
"""
STICKMAN = merge(HEAD, BODY) # this function will return the merged string
STICKMAN将包含这个:
O
/|\
/ \
我尝试过STICKMAN = HEAD + BODY
。它实际上没有用。
任何答案将不胜感激。谢谢你的帮助!
答案 0 :(得分:1)
关于示例字符串的难点在于它们的大小不同(stackoverflow markdown使它们出现在我的代码块中同样有问题)。如果用空格填充它们,你可以选择哪个字符不是空格。在不是空间的情况下你必须赞成其中一个
HEAD = """
O
"""
BODY = r"""
/|\
/ \
"""
def overlap(s1, s2):
return ''.join([c2 if c1.isspace() else c1 for c1, c2 in zip(s1, s2)])
print(overlap(HEAD, BODY))
对于您可以复制粘贴并使其正常工作的版本
HEAD = (
' O \n'
' \n'
' \n'
)
BODY = (
' \n'
'/|\\\n'
'/ \\\n'
)
def overlap(s1, s2):
return ''.join([c2 if c1.isspace() else c1 for c1, c2 in zip(s1, s2)])
print(overlap(HEAD, BODY))
答案 1 :(得分:0)
以下是我如何处理问题*:
考虑每个多行字符串是字符串列表(可以很容易地转换)
字符串split
功能对此任务很有用。
对于“HEAD”字符串列表和“BODY”字符串列表中的每一行,选择非空白的[first]行
一个简单的for循环“迭代每个索引”将在这里工作,并且将是一个很好的实践,就像zip
之类的东西一样。像zip
这样的函数很方便,因为它们建立配对而不关心索引。
这将满足问题,尽管可以应用其他“合并”规则:特别是,添加“|”左臂“/”的身体部分需要在字符串中的字符级别应用相同的概念 - 但现在应该很容易实现,使用上面的方法, string实际上是一个字符列表。
(退后一步,人们甚至可以将多行输入视为字符列表,但这要求字符串中有“空格”字符,以使每行的长度相同。)
转换生成的字符串列表 - 现在包含“HEAD”和“BODY”列表中的一些行 - 返回多行字符串。
请参阅join
,这与split
相反。
(*它变得有点太大而不能很好地适应评论,但本身并不意味着“答案”;因此通常在将一些代码/尝试带到表格时效果最佳,因此可以解决具体问题。 。由于没有提出具体要求,只提供了一个 如何开始解决问题的方法。)
答案 2 :(得分:0)
"".join(map(max,HEAD,BODY))
将起作用。
答案 3 :(得分:0)
由于各个身体部位都有空白,因此只是加入这些部件并不是很有效。
>>> HEAD = \
... """
... O
...
...
... """
>>>
>>> BODY = \
... r"""
...
... /|\
... / \
... """
>>> print(HEAD+BODY)
O
/|\
/ \
>>>
一个解决方案很简单:不要在身体部位放置额外的空白行。如果你真的必须这样做,那么你可以让函数重写零件而不需要额外的空行。
>>> def strip_empty(part):
... lines = part.split('\n')
... return "\n".join(line for line in lines if line.strip())
...
>>> stickman = "\n".join(strip_empty(part) for part in parts)
>>>
>>> print(stickman)
O
/|\
/ \
>>>
答案 4 :(得分:0)
print (HEAD+BODY).replace("\n\n","")
它对我有用。