Pythonic 打印列表项的方法

Posted

技术标签:

【中文标题】Pythonic 打印列表项的方法【英文标题】:Pythonic way to print list items 【发布时间】: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

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

【问题讨论】:

您从哪里得到使用for p in myList“不太好”的印象? @JonClements : chrisarndt.de/talks/rupy/2008/output/slides.html @Guillaume 你确定吗?有一张幻灯片显示“尽可能使用in。好:for key in d: print key”。链接已经死了,所以这里是an archive link。 【参考方案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

【讨论】:

以上是关于Pythonic 打印列表项的方法的主要内容,如果未能解决你的问题,请参考以下文章

从列表中弹出随机元素的最pythonic方法是啥?

Pythonic 列表转字符串方法

pythonic方法来展平嵌套列表? [复制]

避免空列表的默认参数的pythonic方法是啥?

应用三参数函数“减少”列表的pythonic方法是啥?

根据字典替换列表中值的Pythonic方法