我试图了解何时应该使用列表理解。很多时候,方便省线。但有时,它不能按预期工作?
如果我有:
listA = ['1', '2', '3', '4']
我可以使用for循环
for i in listA:
print(i)
显然这会给我:
1
2
3
4
如果我尝试怎么办?
print(i for i in listA)
但这不会给我相同的结果吗?
<generator object <genexpr> at 0x102a3b3b8>
我该如何理解这一点?
我的另外一个问题是: 如果我有一个for循环后跟一行代码,那么总是可以用一种理解来写它吗?
答案 0 :(得分:1)
您没有列表理解。您将生成器表达式传递给print()
。 print()
函数不会迭代您传入的任何参数;它只会将str()
转化为stdout
。
如果您想将生成器中的所有值发送到print()
,请使用*(...)
:
print(*(i for i in listA))
这有点过分,你可以对listA
中的值做同样的事情:
print(*listA)
两者都将使用默认分隔符(空格)打印值。如果您想要换行,请告诉print()
使用\n
作为分隔符:
print(*(i for i in listA), sep='\n')
print(*listA, sep='\n')
不,不是每个for
循环都适合转换为列表理解。列表推导创建一个新的列表对象,而不是所有循环都构建列表。
如果您有表格列表:
some_name = []
for <target> in <iterable>:
some_name.append(<expression>)
然后你可以将它转换为列表理解:
some_name = [<expression> for <target> in <iterable>]
答案 1 :(得分:1)
生成器是可以迭代的对象。它不打算打印。
列表推导有两种形式,有和没有括号:
print(i for i in listA)
print([i for i in listA])
第一个生成迭代器对象,而另一个生成实际列表。
对于您的问题,您可以这样做:
print(*listA, sep='\n')
一般来说,当代码模糊不清时,应该避免使用列表推导。为什么不使用简单的for循环?
答案 2 :(得分:0)
您可以执行以下操作:
listA = ['1', '2', '3', '4']
# option 1
print(*listA, sep='\n')
# option 2
for p in listA: print (p)