如何使连接的ASCII艺术跨越而不是向下

时间:2018-03-28 10:44:35

标签: python string ascii ascii-art

我想将ASCII艺术的字符串连接在一起,但是当我连接它们时,它会下降而不是跨越。如何在Python中水平加入ASCII艺术?

""" 

               :;;:;``                 
              :;';;';                  
              ,'''';:                  
              ::''';,                  
               ''+';                   
                ,',`                   
                 ;`                    
                `;;                    
               :;;;;                   
               '';;';                  
              ,,+'+;;                  
              .'++';:                  
              .':#+;,`                 
               `;';.                   
                   `  

               :;;:;``                 
              :;';;';                  
              ,'''';:                  
              ::''';,                  
               ''+';                   
                ,',`                   
                 ;`                    
                `;;                    
               :;;;;                   
               '';;';                  
              ,,+'+;;                  
              .'++';:                  
              .':#+;,`                 
               `;';.                   
                   ` """

2 个答案:

答案 0 :(得分:0)

你需要做的是连接每一行而不是整个行。

如果您的ASCII艺术中的每一行都是相同的长度,您可以执行以下操作:

a = """|   |
|---|
|   |"""

b = """--|--
  |  
--|--"""

art = (a, b)    

print('\n'.join(' '.join(pair) for pair in zip(*(s.split('\n') for s in art))))

哪个输出

|   | --|--
|---|   |
|   | --|--

说明

首先,我初始化ab以包含两位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

的示例