【问题标题】:Pythonic way to print list itemsPythonic 打印列表项的方法
【发布时间】:2013-03-24 01:12:42
【问题描述】:

我想知道是否有比这更好的方法来打印 Python 列表中的所有对象:

myList = [Person("Foo"), Person("Bar")]
print("\n".join(map(str, myList)))
Foo
Bar

我这样看不太好:

myList = [Person("Foo"), Person("Bar")]
for p in myList:
    print(p)

有没有类似的东西:

print(p) for p in myList

如果不是,我的问题是……为什么?如果我们可以用综合列表来做这种事情,为什么不作为一个列表之外的简单语句呢?

【问题讨论】:

标签: python list printing list-comprehension


【解决方案1】:

假设您使用的是 Python 3.x:

print(*myList, sep='\n')

您可以使用from __future__ import print_function 在 Python 2.x 上获得相同的行为,正如 mgilson 在 cmets 中所指出的那样。

使用 Python 2.x 上的 print 语句,您将需要某种迭代,关于您关于 print(p) for p in myList 不起作用的问题,您可以使用以下内容,它做同样的事情并且仍然是一行:

for p in myList: print p

对于使用'\n'.join() 的解决方案,我更喜欢列表推导和生成器而不是map(),所以我可能会使用以下内容:

print '\n'.join(str(p) for p in myList) 

【讨论】:

  • 如果没有,您可以在 python2.6 及更高版本上from __future__ import print_function
  • 在 python 2x 中使用 map 比在列表理解上使用 join 稍快。
  • 为什么投反对票,真的是因为map() 和发电机之间的速度差异吗? Python's creator also happens to prefer comprehensions and generators over map().
  • 我没有给你投反对票。我熟悉 GVR 的那篇文章,当时他的说法是,python 的未来版本不会包含它,但他们最终留下了。
  • 他们确实停留在 Python 3.x 中,但他在那篇文章中的观点是 [F(x) for x in S]map(F, S) 更清楚。那里没有解决性能问题,但我希望速度差异可以忽略不计。无论如何,我只是对否决票感到困惑,对不起,我以为是你!
【解决方案2】:

我一直用这个:

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])

【讨论】:

  • 若要添加format(),请将str(x) 替换为格式字符串:print " ".join(["{:02d}".format(x) for x in l])
【解决方案3】:

[print(a) for a in list] 会在最后给出一堆 None 类型,尽管它会打印出所有项目

【讨论】:

  • 这是我迄今为止一直在使用的。这是一行,非常清晰和富有表现力,但 linter 抱怨“Expression is assigned to nothing”
  • 如果你想拖钓 linter,你可以创建一个单独的函数来打印它并返回一些愚蠢的值,然后在列表理解中调用该函数
【解决方案4】:

对于 Python 2.*:

如果你为你的 Person 类重载了函数 __str__(),你可以省略带有 map(str, ...) 的部分。另一种方法是创建一个函数,就像你写的那样:

def write_list(lst):
    for item in lst:
        print str(item) 

...

write_list(MyList)

在 Python 3.* 中有用于 print() 函数的参数 sep。查看文档。

【讨论】:

    【解决方案5】:

    扩展@lucasg 的答案(受到它收到的评论的启发):

    要获得格式化列表输出,您可以执行以下操作:

    l = [1,2,5]
    print ", ".join('%02d'%x for x in l)
    
    01, 02, 05
    

    现在", " 提供分隔符(仅在项目之间,而不是在末尾),格式字符串'02d'%x 结合为每个项目提供格式化字符串x - 在这种情况下,格式为一个两位数的整数,左填充零。

    【讨论】:

      【解决方案6】:

      为了显示每个内容,我使用:

      mylist = ['foo', 'bar']
      indexval = 0
      for i in range(len(mylist)):     
          print(mylist[indexval])
          indexval += 1
      

      在函数中使用示例:

      def showAll(listname, startat):
         indexval = startat
         try:
            for i in range(len(mylist)):
               print(mylist[indexval])
               indexval = indexval + 1
         except IndexError:
            print('That index value you gave is out of range.')
      

      希望我能帮上忙。

      【讨论】:

      • 请注意,请检查您上面的答案。您使用了一个范围,它提供了一个索引值 i,但您使用另一个变量 indexval 作为您的索引?您正在与 python 的简单性作斗争。 for val in my_list: print val 和你所拥有的一样
      【解决方案7】:

      如果你只想查看列表中的内容,我认为这是最方便的:

      myList = ['foo', 'bar']
      print('myList is %s' % str(myList))
      

      简单易读,可与格式字符串配合使用。

      【讨论】:

        【解决方案8】:

        我最近制作了一个密码生成器,虽然我对 python 还很陌生,但我还是把它作为一种在列表中显示所有项目的方式(根据您的需要进行一些小的编辑......

            x = 0
            up = 0
            passwordText = ""
            password = []
            userInput = int(input("Enter how many characters you want your password to be: "))
            print("\n\n\n") # spacing
        
            while x <= (userInput - 1): #loops as many times as the user inputs above
                    password.extend([choice(groups.characters)]) #adds random character from groups file that has all lower/uppercase letters and all numbers
                    x = x+1 #adds 1 to x w/o using x ++1 as I get many errors w/ that
                    passwordText = passwordText + password[up]
                    up = up+1 # same as x increase
        
        
            print(passwordText)
        

        就像我说的,我对 Python 非常陌生,我相信这对于专家来说是笨拙的,但我只是为了另一个例子

        【讨论】:

          【解决方案9】:

          假设您可以打印列表 [1,2,3],那么 Python3 中的一种简单方法是:

          mylist=[1,2,3,'lorem','ipsum','dolor','sit','amet']
          
          print(f"There are {len(mylist):d} items in this lorem list: {str(mylist):s}")
          

          运行它会产生以下输出:

          这个 lorem 列表中有 8 个项目:[1, 2, 3, 'lorem', 'ipsum', 'dolor', '坐', 'amet']

          【讨论】:

            【解决方案10】:

            OP 的问题是:是否存在类似以下的事情,如果不存在,那么为什么

            print(p) for p in myList # doesn't work, OP's intuition
            

            答案是,它确实存在,即:

            [p for p in myList] #works perfectly
            

            基本上,使用[] 进行列表理解并去掉print 以避免打印None。要了解为什么 print 会打印 None,请参阅 this

            【讨论】:

              【解决方案11】:

              使用单行代码打印给定列表的每个元素

               for i in result: print(i)
              

              【讨论】:

                【解决方案12】:

                您还可以使用 len() 函数并确定列表的长度来打印元素,如下例所示:

                sample_list = ['Python', 'is', 'Easy']
                
                for i in range(0, len(sample_list)):
                
                      print(sample_list[i])
                

                参考:https://favtutor.com/blogs/print-list-python

                【讨论】:

                  猜你喜欢
                  • 2017-12-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-11-27
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多