2017-04-20 17 views
1

私は現在、この多次元のリストを持っていると私はそれから1列目を抽出しようとしています:これら2つのループの違いは何ですか?

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

を使用しています。ジェネレータオブジェクトとは何ですか?なぜ第1コードセットが第2コードと何か異なるものを返しますか?どちらも非常によく似ています。

<generator object <genexpr> at 0x001A9E10> 
generator 

返信いただきありがとうございます。初心者のpythonではなく、本当に学びたい。

+3

リスト内包表記はかっこではなく角かっこを使用します。かっこがgenexpを作成します。 – user2357112

+0

[このディスカッション](http://stackoverflow.com/questions/1756096/understanding-generators-in-python)に興味があるかもしれません。かっこは、リストの理解(角括弧を使用)ではなく、生成者の理解を行います。 –

+1

'sitelist = [データの行の行[0]] – ozgur

答えて

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に格納(参照)されます。

pythonの反復プロトコルの詳細については、this answerを参照してください。
次に、Pythonでジェネレータを探索します。様々なレベルのジェネレータを説明する記事/ブログ記事が多数あります。

関連する問題