我想将ASCII艺术的字符串连接在一起,但是当我连接它们时,它会下降而不是跨越。如何在Python中水平加入ASCII艺术?
"""
:;;:;``
:;';;';
,'''';:
::''';,
''+';
,',`
;`
`;;
:;;;;
'';;';
,,+'+;;
.'++';:
.':#+;,`
`;';.
`
:;;:;``
:;';;';
,'''';:
::''';,
''+';
,',`
;`
`;;
:;;;;
'';;';
,,+'+;;
.'++';:
.':#+;,`
`;';.
` """
答案 0 :(得分:0)
你需要做的是连接每一行而不是整个行。
如果您的ASCII艺术中的每一行都是相同的长度,您可以执行以下操作:
a = """| |
|---|
| |"""
b = """--|--
|
--|--"""
art = (a, b)
print('\n'.join(' '.join(pair) for pair in zip(*(s.split('\n') for s in art))))
哪个输出
| | --|--
|---| |
| | --|--
首先,我初始化a
和b
以包含两位ASCII艺术并将它们存储在元组art
中。这也可以是列表或其他容器。它只需要是可迭代的东西。
大多数事情发生在最后一行,所以让我们分解它。从内在表达向外工作:
(s.split('\n') for s in art)
这是一个生成器表达式。它循环遍历art
并拆分它在'\n'
上找到的每个项目,这是换行符。因此,它将art
中的每个项目拆分为行。
zip(*(s.split('\n') for s in art))
zip
是一个奇怪的函数来解释,因此我将使用一个示例:zip((1, 2, 3), (4, 5, 6))
返回一个包含(1, 4)
,(2, 5)
和(3,6)的迭代)`。
在这种情况下,这意味着它从序列中的每一段ASCII艺术中获取一条线并将它们放在元组中。
' '.join(pair) for pair in zip(*(s.split('\n') for s in art))
这将获取zip
调用的结果,并将每对与空格连接起来。也就是说,它将ASCII艺术的每个部分中的每一行连接起来,并在它们之间留有空格。
'\n'.join(' '.join(pair) for pair in zip(*(s.split('\n') for s in art)))
这会将每个结果行与换行符连接起来,从而形成一个字符串。
答案 1 :(得分:0)
使用.split()拆分新行,然后使用.join()合并它们。使用.format()确保字符串不合并,例如:
这是一个将所有内容组合在一起的函数:
def join_art(s1,s2,str_between=''):
lines1 = s1.split('\n')
lines2 = s2.split('\n')
max_dist = max([len(s) for s in lines1])
f_str = '{:<'+str(max_dist)+'}{}{}'
s3 = "\n".join([f_str.format(str1,str_between,str2) for str1,str2 in zip(lines1,lines2)])
return s3
示例用法:
In [31]: s1 = """
(~\ _
\ \ / \
\ \___/ /\\
| , , | ~
( =v= )
` ^ ' mh
"""
In [32]: s2 = """
/\ /|
|||| |
\ | \
_ _ / @ @
/ \ =>X<=
/| | /
\| /__| |
\_____\ \__\ """
In [58]: print (join_art(s1,s2))
(~\ _ /\ /|
\ \ / \ |||| |
\ \___/ /\ \ | \
| , , | ~ _ _ / @ @
( =v= ) / \ =>X<=
` ^ ' mh /| | /
\| /__| |
In [59]: print (join_art(s1,s2,str_between=' |==| '))
|==|
(~\ _ |==| /\ /|
\ \ / \ |==| |||| |
\ \___/ /\ |==| \ | \
| , , | ~ |==| _ _ / @ @
( =v= ) |==| / \ =>X<=
` ^ ' mh |==| /| | /
|==| \| /__| |
*艺术作为取自here
的示例