这两个for循环之间有什么区别?

时间:2017-04-20 18:41:26

标签: python for-loop

我目前有这个多维列表,我正在尝试从中提取第一列:

>>> print(data)
[['com.borderstylo.retrollect', '0', '0'], ['aabasoft.presents.goldprice', '0', '0'], ['aberl.vlc.light.mote', '0', '0']]

当我使用

sitelist = [] 
for row in data:
    sitelist.append(row[0])
print(sitelist)

我得到了下面的输出,这就是我所追求的。

['com.borderstylo.retrollect', 'aabasoft.presents.goldprice', 'aberl.vlc.light.mote']

然而,当我使用

sitelist = []
sitelist = (row[0] for row in data)
print(sitelist)
type(sitelist)

我得到下面的输出,这是一个生成器对象。什么是生成器对象?为什么第一组代码返回与第二组不同的东西?两者看起来非常相似。

<generator object <genexpr> at 0x001A9E10>
generator

非常感谢你的回复。新手在python,但真的想学习。

2 个答案:

答案 0 :(得分:1)

使用[]创建python中的列表推导。 作为替代方案,在处理非常大的数据时,您可以使用与理解相同的语法构建生成器,仅使用()

因此,只需使用()更改[]

答案 1 :(得分:1)

row[0] for row in data给出了一个生成器对象。这就像懒惰的评价。这意味着for循环不会被执行以产生结果,而是创建一个生成器对象,可以在需要时一次执行for循环一次迭代。
这样做是为了提高时间和记忆效率。

如果括在括号中,sitelist = (row[0] for row in data)将被视为表达式,生成的生成器对象将存储(引用)在sitelist中。

当它用方括号括起来时,sitelist = [row[0] for row in data]它是一个列表理解。 for循环立即执行,并在sitelist中构造并存储(引用)列表。

查看this answer以获取有关python中迭代协议的更多信息 然后在python中探索生成器。有许多文章/博客文章解释了具有不同级别细节的生成器。