关于python:Pythonic打印列表项的方法

Pythonic way to print list items

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

1
2
3
4
5
myList = [Person("Foo"), Person("Bar")]
print("
"
.join(map(str, myList)))
Foo
Bar

我这样读不太好:

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

有没有类似的东西:

1
print(p) for p in myList

如果不是,我的问题是…为什么?如果我们能用全面的列表来做这类事情,为什么不作为列表之外的简单语句呢?


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

1
2
print(*myList, sep='
'
)

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

有了python 2.x上的print语句,您将需要某种类型的迭代,关于您关于print(p) for p in myList不起作用的问题,您只需使用以下语句,它执行相同的操作,并且仍然是一行:

1
for p in myList: print p

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

1
2
print '
'
.join(str(p) for p in myList)


我一直在用这个:

1
2
3
4
#!/usr/bin/python

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


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


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

要获得格式化的列表输出,可以沿着这些行执行一些操作:

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

01, 02, 05

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


对于Python 2。*:

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

1
2
3
4
5
6
7
def write_list(lst):
    for item in lst:
        print str(item)

...

write_list(MyList)

python 3.*中有print()函数的参数sep。查看文档。


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

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

在函数中使用的示例:

1
2
3
4
5
6
7
8
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.')

希望我能帮上忙。


我最近做了一个密码生成器,虽然我对python很陌生,但我把它作为一种在列表中显示所有项目的方式(通过小的编辑来满足您的需求…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    x = 0
    up = 0
    passwordText =""
    password = []
    userInput = int(input("Enter how many characters you want your password to be:"))
    print("


"
) # 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很陌生,我相信这对于一个专家来说是笨拙的,但我只是举个例子。


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

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

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

1
[p for p in myList] #works perfectly

基本上,使用[]进行列表理解,去掉print以避免打印None。要知道为什么print打印None,请看这个。


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

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

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


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

1
2
3
mylist=[1,2,3,'lorem','ipsum','dolor','sit','amet']

print(f"There are {len(mylist):d} items in this lorem list: {str(mylist):s}")

运行该命令将产生以下输出:

There are 8 items in this lorem list: [1, 2, 3, 'lorem', 'ipsum',
'dolor', 'sit', 'amet']