python列表理解变换

时间:2017-10-08 21:01:02

标签: python list-comprehension

我试图了解何时应该使用列表理解。很多时候,方便省线。但有时,它不能按预期工作?

如果我有:

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循环后跟一行代码,那么总是可以用一种理解来写它吗?

3 个答案:

答案 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)