【问题标题】:How to right-justify elements in a list? [duplicate]如何右对齐列表中的元素? [复制]
【发布时间】:2018-09-24 06:42:06
【问题描述】:

我需要我的函数来打印以下内容:

  apples Alice  dogs
 oranges   Bob  cats
cherries Carol moose
  banana David goose

所有项目都向右对齐

我有解决方案,但这是一种解决方法,您能帮我纠正我的解决方案吗?

tableData = [['apples', 'oranges', 'cherries', 'banana'],
             ['Alice', 'Bob', 'Carol', 'David'],
             ['dogs', 'cats', 'moose', 'goose']]

def printData(lst):
  colWidths = [0] * len(tableData)

  for a in range(len(tableData)):
    colWidths[a] = len(max(tableData[a], key=len))

  for i in range(len(lst[0])):
    output = ''
    for j in range(len(lst)):
      output += (str(lst[j][i])).rjust(colWidths[0])
    print(output)


print(printData(tableData))

  apples   Alice    dogs
 oranges     Bob    cats
cherries   Carol   moose
  banana   David   goose

【问题讨论】:

    标签: python nested-lists


    【解决方案1】:

    您可以将format specification mini languagestr.format 一起使用

    tableData = [['apples', 'oranges', 'cherries', 'banana'],
                 ['Alice', 'Bob', 'Carol', 'David'],
                 ['dogs', 'cats', 'moose', 'goose']]
    
    for tup in zip(*tableData):
        print("{:>9} {:>9} {:>9}".format(*tup))
    

    打印

       apples     Alice      dogs
      oranges       Bob      cats
     cherries     Carol     moose
       banana     David     goose
    

    编辑:

    你可以动态生成这些字符串,如果你在编写代码时不知道你想要的列的大小

    from itertools import chain
    
    def gen_format_str(widths):
        return ' '.join(["{{:>{}}}".format(width) for width in widths])
    
    def n_of_width(n, width):
        return gen_format_str([width] * n)
    
    def all_widest(list_of_lists):
        return n_of_width(len(list_of_lists), max(map(len, chain.from_iterable(list_of_lists))))
    
    format_str = all_widest(tableData)
    
    for tup in zip(*tableData):
        print(format_str.format(*tup))
    

    format_str'{:>8} {:>8} {:>8}',因为最长的单词“cherries”是 8 个字符。

    【讨论】:

    • 打败我一秒钟
    • 但是怎么知道9就够了?
    • @nikkitikitavi 你没有。我将提供一种基于某些条件动态生成这些格式字符串的方法。
    • @nikkitikitavi 看到我的编辑。使用格式语言,它非常强大,并且没有文档显示的那么复杂。查看pyformat.info,那里的教程很不错。
    【解决方案2】:

    这样做:

    for index in range(len(tableData)):
    

    大约 80% 的时间都是错误的。请先使用for a in mylistfor index,a in enumerate(mylist) 进行尝试。这通常是一种更简单的方法。

    在这种情况下:

    >>> tableData = [['apples', 'oranges', 'cherries', 'banana'],
                 ['Alice', 'Bob', 'Carol', 'David'],
                 ['dogs', 'cats', 'moose', 'goose']]
    >>> fruits, persons, pets = tableData
    >>> for n,fruit in enumerate(fruits):
            print (f"{fruit:>8s} {persons[n]:>8s} {pets[n]:>8s}")
      apples    Alice     dogs
     oranges      Bob     cats
    cherries    Carol    moose
      banana    David    goose
    

    但这并不能处理缩放列宽以占用所需空间最少的问题。要包含该细化,请计算列宽并将它们包含在格式中:

    >>> widths = [max(len(x) for x in d) for d in tableData]
    >>> for n,fruit in enumerate(fruits):
            print (f"{fruit:>{widths[0]}s} {persons[n]:>{widths[1]}s} {pets[n]:>{widths[2]}s}")
    
      apples Alice  dogs
     oranges   Bob  cats
    cherries Carol moose
      banana David goose
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 2018-05-31
      相关资源
      最近更新 更多