繁体   English   中英

在同一行上打印多行字符串(ascii art)的最佳和最短方法,即使 Python 中的高度不同

[英]The best and shortest way to print multiline strings (ascii art) on the same line, even when the height is different in Python

# Rock
rock = ("""Rock
    _______
---'   ____)
      (_____)
      (_____)   
      (____)
---.__(___)
""")

# Paper
paper = ("""Paper
     _______
---'    ____)____
           ______)
          _______)  
         _______)
---.__________)
""")

# Scissors
scissors = ("""Scissors
    _______
---'   ____)____
          ______)
       __________)  
      (____)
---.__(___)
""")

如何在同一行打印这些多行字符串?

我正在寻找最简单和最短的方法,我尝试了一些我看到的技巧,但到目前为止还没有运气。

谢谢

In [19]: for rps in zip(*(thing.split('\n') for thing in (rock, paper, scissors))):
    ...:     print(("%-25s"*3)%(rps))
    ...: 
Rock                     Paper                    Scissors                 
    _______                   _______                 _______              
---'   ____)             ---'    ____)____        ---'   ____)____         
      (_____)                       ______)                 ______)        
      (_____)                      _______)              __________)       
      (____)                      _______)              (____)             
---.__(___)              ---.__________)          ---.__(___)              
                                                                           

In [20]: 

更灵活?

In [24]: def pol(*list_of_things):
    ...:     return '\n'.join(("%-25s"*len(list_of_things))%(rps) for rps in zip(*(thing.split('\n') for thing in list_of_things)))

In [25]: print(pol(scissors, scissors, rock))
Scissors                 Scissors                 Rock                     
    _______                  _______                  _______              
---'   ____)____         ---'   ____)____         ---'   ____)             
          ______)                  ______)              (_____)            
       __________)              __________)             (_____)            
      (____)                   (____)                   (____)             
---.__(___)              ---.__(___)              ---.__(___)              
                                                                           

In [26]: 

评论


rock等是包含几个换行符的单个字符串,我们想在同一行打印来自rock的一行、来自paper的一行和来自scissors的一行,所以我们需要做的第一件事就是拆分每个string 获取字符串列表的列表

list_of_lists_of_strings = [thing.split('\n') for thing in (rock, paper, scissors)]
# [['rock', '    _______', ...], ['paper', '    _______', ...], [...]]

但我们真的需要

[['rock', 'paper', 'scissors'],
 ['    _______', '    _______', '    _______'],
 [..., ..., ...]
 ...,
]

也就是说,字符串列表列表的转置,但这是 Python 中众所周知的习语(它不是真正的列表,但是……)

transposed_list = zip(*list_of_lists_of_strings)

此时,我们可以使用适当的格式打印transposed_list中的每个三元组元素( %-25s输出一个 25 个字符长的字符串,右侧填充空白)。

将其作为一项功能留作练习……


子评论


IMO,尽可能不应该提供副作用,如打印。

一行上任意数量的图像(纸有一个额外的手指来证明它仍然适用于不同的图像尺寸):

import itertools

def print_on_line(*images):
    lines = list(map(str.splitlines, images))
    max_length = max(map(len, itertools.chain.from_iterable(lines)))
    lines_padded = [[line.ljust(max_length, " ") for line in image]
                    for image in lines]
    lines_combined = itertools.zip_longest(*lines_padded, 
                                           fillvalue=" " * max_length)
    print("\n".join(map("".join, lines_combined)))


print_on_line(paper, scissors, paper, rock)


# out:
Paper               Scissors            Paper               Rock                
     _______            _______              _______            _______         
---'    ____)____   ---'   ____)____    ---'    ____)____   ---'   ____)        
           ______)            ______)              ______)        (_____)       
          _______)         __________)            _______)        (_____)       
         _______)         (____)                 _______)         (____)        
         _______)   ---.__(___)                  _______)   ---.__(___)         
         _______)                                _______)                       
---.__________)                         ---.__________)                         

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM