【问题标题】:Pretty print 2D list?漂亮的打印二维列表?
【发布时间】:2012-10-24 06:25:34
【问题描述】:

是否有一种简单的内置方法可以将 2D Python 列表打印为 2D 矩阵?

所以这个:

[["A", "B"], ["C", "D"]]

会变成这样的

A    B
C    D

我找到了pprint 模块,但它似乎没有达到我想要的效果。

【问题讨论】:

标签: python matrix


【解决方案1】:

您可以更新printend=' ',以便在内循环中打印空格而不是'\n',而外循环可以有print()

a=[["a","b"],["c","d"]]
for i in a:
  for j in i:
    print(j, end=' ')
  print()

我从here 找到了这个解决方案。

【讨论】:

    【解决方案2】:

    我还推荐tabulate,它也可以选择打印标题:

    from tabulate import tabulate
    
    lst = [['London', 20],['Paris', 30]]
    print(tabulate(lst, headers=['City', 'Temperature']))
    

    City      Temperature
    ------  -------------
    London             20
    Paris              30
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 Notebook/IPython 环境,那么 sympy 可以使用 IPython.display 打印令人愉悦的矩阵:

      import numpy as np
      from sympy import Matrix, init_printing
      init_printing()
      
      print(np.random.random((3,3)))
      display(np.random.random((3,3)))
      display(Matrix(np.random.random((3,3))))
      

      【讨论】:

        【解决方案4】:

        对于没有任何第三方库的 Python 3:

        matrix = [["A", "B"], ["C", "D"]]
        
        print('\n'.join(['\t'.join([str(cell) for cell in row]) for row in matrix]))
        

        输出

        A   B
        C   D
        

        【讨论】:

        • 在这里被低估的答案。效果很好,保持原生,一行 FTW。
        • 我唯一的遗憾是,我只能为这个答案投一票
        【解决方案5】:

        只是为print('\n'.join(\['\t'.join(\[str(cell) for cell in row\]) for row in matrix\])) 提供一个更简单的替代方案:

        matrix = [["A", "B"], ["C", "D"]]
        for row in matrix:
            print(*row)
        

        说明 *row 解包row,因此当row["A", "B"] 时调用print("A", "B")

        注意 只有当每列具有相同的宽度时,这两个答案才会被很好地格式化。要更改分隔符,请使用 sep 关键字。例如,

        for row in matrix:
            print(*row, sep=', ')
        

        将打印

        A, B
        C, D
        

        改为。

        没有 for 循环的单行代码

        print(*(' '.join(row) for row in matrix), sep='\n')
        

        ' '.join(row) for row in matrix) 为每一行返回一个字符串,例如当row["A", "B"] 时,A B

        【讨论】:

        • 好东西,哎。
        【解决方案6】:

        您可以随时使用numpy

        import numpy as np
        A = [['A', 'B'], ['C', 'D']]
        print(np.matrix(A))
        

        输出:

        [['A' 'B']
         ['C' 'D']]
        

        【讨论】:

        • 显示输出以与其他解决方案进行比较将是一个“很高兴”
        • 使用print(np.array(A)) 避免警告
        【解决方案7】:

        见以下代码。

        # Define an empty list (intended to be used as a matrix)
        matrix = [] 
        matrix.append([1, 2, 3, 4])
        matrix.append([4, 6, 7, 8])
        print matrix
        # Now just print out the two rows separately
        print matrix[0]
        print matrix[1]
        

        【讨论】:

        【解决方案8】:

        如果您可以使用 Pandas(Python 数据分析库),您可以通过将其转换为 DataFrame 对象来漂亮地打印 2D 矩阵:

        from pandas import *
        x = [["A", "B"], ["C", "D"]]
        print DataFrame(x)
        
           0  1
        0  A  B
        1  C  D
        

        【讨论】:

        • 虽然此答案可能是正确且有用的,但如果您 include some explanation along with it 解释它如何帮助解决问题,则最好。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
        • 这正是我想要的。谢谢。
        【解决方案9】:

        pandas 更轻量级的方法是使用prettytable 模块

        from prettytable import PrettyTable
        
        x = [["A", "B"], ["C", "D"]]
        
        p = PrettyTable()
        for row in x:
            p.add_row(row)
        
        print p.get_string(header=False, border=False)
        

        产量:

        A B
        C D
        

        prettytable 有很多选项可以以不同方式格式化您的输出。

        更多信息请见https://code.google.com/p/prettytable/

        【讨论】:

          【解决方案10】:

          为了让事情变得有趣,让我们尝试一个更大的矩阵:

          matrix = [
             ["Ah!",  "We do have some Camembert", "sir"],
             ["It's a bit", "runny", "sir"],
             ["Well,",  "as a matter of fact it's", "very runny, sir"],
             ["I think it's runnier",  "than you",  "like it, sir"]
          ]
          
          s = [[str(e) for e in row] for row in matrix]
          lens = [max(map(len, col)) for col in zip(*s)]
          fmt = '\t'.join('{{:{}}}'.format(x) for x in lens)
          table = [fmt.format(*row) for row in s]
          print '\n'.join(table)
          

          输出:

          Ah!                     We do have some Camembert   sir            
          It's a bit              runny                       sir            
          Well,                   as a matter of fact it's    very runny, sir
          I think it's runnier    than you                    like it, sir  
          

          UPD:对于多行单元格,这样的东西应该可以工作:

          text = [
              ["Ah!",  "We do have\nsome Camembert", "sir"],
              ["It's a bit", "runny", "sir"],
              ["Well,",  "as a matter\nof fact it's", "very runny,\nsir"],
              ["I think it's\nrunnier",  "than you",  "like it,\nsir"]
          ]
          
          from itertools import chain, izip_longest
          
          matrix = chain.from_iterable(
              izip_longest(
                  *(x.splitlines() for x in y), 
                  fillvalue='') 
              for y in text)
          

          然后应用上面的代码。

          另见http://pypi.python.org/pypi/texttable

          【讨论】:

          • 天才!但是,如果我们想要每个单元格内有多条线,即 3D 数组 :)
          • @CpILL:一种选择是将 3D 解压缩为 2D:[[[a,b,c],[xyz]]]=>[[a,x],[b,y],[c,z]],然后应用上述内容。
          • 你的意思是透视数据?
          • @CpILL:添加了一个示例。
          • 我们如何将表格限制为前 10 个值?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-02
          • 2022-01-22
          • 1970-01-01
          • 2021-06-22
          相关资源
          最近更新 更多