【问题标题】:How to print a list in Python "nicely"如何“很好地”在 Python 中打印列表
【发布时间】:2009-10-06 04:55:40
【问题描述】:

在 PHP 中,我可以这样做:

echo '<pre>'
print_r($array);
echo '</pre>'

在 Python 中,我目前只是这样做:

print the_list

但是,这会导致大量数据。有没有办法将它很好地打印到可读的树中? (有缩进)?

【问题讨论】:

    标签: python


    【解决方案1】:
    from pprint import pprint
    pprint(the_list)
    

    【讨论】:

    • 如何漂亮地打印到文件中?
    • 为什么不直接使用import pprint
    • @clankill3r,那么你需要使用pprint.pprint(the_list) 通常这只是个人喜好问题。在这种情况下,我选择在导入行中添加额外的混乱。
    • @Mawg,可以使用stream=指定输出流,默认为stdout。 docs.python.org/3/library/pprint.html
    • Ipython REPL 中默认启用
    【解决方案2】:

    只需“解压”打印函数参数中的列表并使用换行符 (\n) 作为分隔符。

    打印(*lst, sep='\n')

    lst = ['foo', 'bar', 'spam', 'egg']
    print(*lst, sep='\n')
    
    foo
    bar
    spam
    egg
    

    【讨论】:

    • 不错,但不幸的是仅在 Python 3 中可用。
    • 如果你在 Python 2.7 中确实需要它,你仍然可以从 future from __future__ import print_function 导入打印功能。感谢您的评论。
    • * 很重要,让我等一下 x)
    • IMO 在 2021 年以 Python 3 为标准,这应该是公认的答案
    【解决方案3】:

    在无需导入pprint 的情况下进行调试的快速技巧是加入'\n' 上的列表。

    >>> lst = ['foo', 'bar', 'spam', 'egg']
    >>> print '\n'.join(lst)
    foo
    bar
    spam
    egg
    

    【讨论】:

    • 当列表包含None时出现类型错误。
    • 简单的解决方案,可以像 `"list: * {}".format('\n * '.join(lst)) 一样格式化
    • 当您的列表包含其他字符串时,您应该这样做print '\n'.join(map(str, lst))
    【解决方案4】:

    你的意思是......:

    >>> print L
    ['this', 'is', 'a', ['and', 'a', 'sublist', 'too'], 'list', 'including', 'many', 'words', 'in', 'it']
    >>> import pprint
    >>> pprint.pprint(L)
    ['this',
     'is',
     'a',
     ['and', 'a', 'sublist', 'too'],
     'list',
     'including',
     'many',
     'words',
     'in',
     'it']
    >>> 
    

    ...?从您粗略的描述中,首先想到的是标准库模块pprint;但是,如果您可以描述示例输入和输出(这样您就不必为了帮助您而学习 PHP;-),我们可能会提供更具体的帮助!

    【讨论】:

      【解决方案5】:
      import json
      some_list = ['one', 'two', 'three', 'four']
      print(json.dumps(some_list, indent=4))
      

      输出:

      [
          "one",
          "two",
          "three",
          "four"
      ]
      

      【讨论】:

        【解决方案6】:

        https://docs.python.org/3/library/pprint.html

        如果您需要文本(例如与 curses 一起使用):

        import pprint
        
        myObject = []
        
        myText = pprint.pformat(myObject)
        

        然后myText 变量将类似于 php var_dumpprint_r。查看文档以获取更多选项和参数。

        【讨论】:

          【解决方案7】:

          对于Python 3,我做的事情和shxfee's answer一样:

          def print_list(my_list):
              print('\n'.join(my_list))
          
          a = ['foo', 'bar', 'baz']
          print_list(a)
          

          哪个输出

          foo
          bar
          baz
          

          顺便说一句,我使用类似的辅助函数来快速查看 pandas DataFrame 中的列

          def print_cols(df):
              print('\n'.join(df.columns))
          

          【讨论】:

            【解决方案8】:

            正如其他答案所暗示的那样, pprint 模块可以解决问题。
            尽管如此,在调试的情况下,您可能需要将整个列表放入某个日志文件中,可能必须使用 pformat 方法以及模块 logging 和 pprint。

            import logging
            from pprint import pformat
            
            logger = logging.getLogger('newlogger')
            handler = logging.FileHandler('newlogger.log')
            
            formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
            handler.setFormatter(formatter)
            
            logger.addHandler(handler) 
            logger.setLevel(logging.WARNING)
            
            data = [ (i, { '1':'one',
                       '2':'two',
                       '3':'three',
                       '4':'four',
                       '5':'five',
                       '6':'six',
                       '7':'seven',
                       '8':'eight',
                       })
                     for i in xrange(3)
                  ]
            
            logger.error(pformat(data))
            

            如果您需要直接将其记录到文件中,则必须使用 stream 关​​键字指定输出流。 Ref

            from pprint import pprint
            
            with open('output.txt', 'wt') as out:
               pprint(myTree, stream=out)
            

            Stefano Sanfilippo's answer

            【讨论】:

              【解决方案9】:

              正如其他答案所提到的,pprint 是一个很棒的模块,可以满足您的需求。但是,如果您不想导入它而只想在开发过程中打印调试输出,您可以近似其输出。

              其他一些答案适用于字符串,但如果你用类对象尝试它们,它会给你错误TypeError: sequence item 0: expected string, instance found

              对于更复杂的对象,请确保该类有一个__repr__ 方法来打印您想要的属性信息:

              class Foo(object):
                  def __init__(self, bar):
                      self.bar = bar
              
                  def __repr__(self):
                      return "Foo - (%r)" % self.bar
              

              然后,当您想要打印输出时,只需将您的列表映射到 str 函数,如下所示:

              l = [Foo(10), Foo(20), Foo("A string"), Foo(2.4)]
              print "[%s]" % ",\n ".join(map(str,l))
              

              输出:

               [Foo - (10),
                Foo - (20),
                Foo - ('A string'),
                Foo - (2.4)]
              

              您还可以执行诸如覆盖list__repr__ 方法之类的操作,以获得一种嵌套的漂亮打印形式:

              class my_list(list):
                  def __repr__(self):
                      return "[%s]" % ",\n ".join(map(str, self))
              
              a = my_list(["first", 2, my_list(["another", "list", "here"]), "last"])
              print a
              

              给予

              [first,
               2,
               [another,
               list,
               here],
               last]
              

              很遗憾,没有二级缩进,但为了快速调试,它可能很有用。

              【讨论】:

                【解决方案10】:

                你也可以循环遍历你的列表:

                def fun():
                  for i in x:
                    print(i)
                
                x = ["1",1,"a",8]
                fun()
                

                【讨论】:

                【解决方案11】:

                这是我经常使用的原始 python 方法!

                代码如下所示:

                list = ["a", "b", "c", "d", "e", "f", "g"]
                
                for i in range(len(list)):
                    print(list[i])
                

                输出:

                a
                b
                c
                d
                e
                f
                g
                

                【讨论】:

                  【解决方案12】:

                  如果您只想按原样显示列表(带括号),请使用:

                  print(list(the_list))
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-11-25
                    • 2010-12-04
                    • 1970-01-01
                    • 2020-04-08
                    • 2019-10-07
                    • 1970-01-01
                    • 2012-09-15
                    • 1970-01-01
                    相关资源
                    最近更新 更多