Python方式打印列表项


114

我想知道是否有比这更好的方法来打印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

如果没有,我的问题是...为什么?如果我们可以使用综合列表来完成此类工作,为什么不将其作为列表之外的简单语句呢?


3
您从哪里得到使用for p in myList“不是很好” 的印象?
乔恩·克莱门茨


@pelotasplus:一点也不:)顺便说一句,我真的不喜欢我的第一个不可读的版本
Guillaume Voiron

Answers:


220

假设您正在使用Python 3.x:

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

您可以使用from __future__ import print_function,在Python 2.x上获得相同的行为,如mgilson在评论中所述。

使用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) 

3
如果没有,则可以from __future__ import print_function使用python2.6及更高版本。
mgilson

在python 2x中,使用map略快于在列表理解中使用join。
Juan Carlos Moreno

1
为什么要降票,这真的是由于map()发电机和发电机之间的速度差异造成的吗? Python的创建者也碰巧更喜欢理解和生成器map()
安德鲁·克拉克

我没有对你投反对票。我对GVR的那篇文章很熟悉,那是他当时说的话,未来的python版本将如何不包含它,但最终还是留下了。
Juan Carlos Moreno

1
他们的确留在了Python 3.x中,但是他在那篇文章中的观点[F(x) for x in S]是比map(F, S)。此处未解决性能问题,但我希望速度差异可以忽略不计。无论如何,我只是对票选感到困惑,对不起,我以为是你!
Andrew Clark

28

我经常用这个 :

#!/usr/bin/python

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

1
要添加format(),请str(x)用格式字符串替换:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman

8

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


到目前为止,这是我一直在使用的。这是一条线,很清晰,expresive,但棉短绒投诉“表达被分配到什么”
alete

1
如果您想
拖曳短绒

3

对于Python 2. *:

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

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

...

write_list(MyList)

Python 3. * 中有print()函数的参数sep。看一下文档。


3

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

要获得格式化的列表输出,可以按照以下步骤进行操作:

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

01, 02, 05

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


2

要显示每个内容,我使用:

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.')

希望我能帮上忙。


1
只是作为注释,请检查上方的答案。您使用一个提供索引值的范围,即i,但您使用另一个变量indexval作为索引?您正在与python的简单性作斗争。for my_list中的val:print val与您所拥有的功能相同
BretD

1

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

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

简单,易读,可与格式字符串一起使用。


1

OP的问题是:是否存在类似以下内容的内容,如果不存在,为什么?

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

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

[p for p in myList] #works perfectly

基本上,[]用于列表理解并print避免避免打印None。看看为什么print打印None看到这个


1

我最近制作了一个密码生成器,尽管我对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)

就像我说的,IM对Python非常新,我相信这对于专家来说是笨拙的方式,但是我在这里只是另一个例子


0

假设您可以很好地打印列表[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','sit','amet']

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.