2017-04-20 121 views
1

我現在有這個多維度的列表,我試圖從它的第一列:這兩個for循環之間的區別是什麼?

>>> 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,但真的想學習。

+3

列表解析使用括號,而不是括號。圓括號表示基因xp。 – user2357112

+0

您可能對[本討論]感興趣(http://stackoverflow.com/questions/1756096/understanding-generators-in-python)。括號使發電機理解,而不是列表理解(使用括號)。 –

+1

'sitelist = [row [0] for row in data]' – ozgur

回答

1

python中的列表解析使用[]創建。 作爲一種替代方案,當處理非常大的數據時,您可以使用與理解相同的語法構建生成器,只能使用()

因此,只需更改()[]

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中探索生成器。有許多文章/博客文章解釋生成器具有不同程度的細節。

相關問題