web-dev-qa-db-ja.com

ジェネレーターオブジェクトをリストに変換する方法は?

私のコード

def yieldlines(thefile, whatlines):
  return (x for i, x in enumerate(thefile) if i in whatlines)

file1=open('/home/milenko/EDIs/site1/newst2.txt','r')
whatlines1 = [line.strip() for line in open('m1.dat', 'r')]

x1=yieldlines(file1, whatlines1)

print x1

わかった

<generator object <genexpr> at 0x7fa3cd3d59b0>

リストはどこに置くべきですか、それともコードを書き直す必要がありますか?

私のプログラムにファイルをペンさせて、m1.datに書き込まれている特定の行の内容を読み取らせたいのですが、その解決策を見つけました Reading specific lines only(Python)

6
Richard Rublev

実際にリストが必要な場合は、次のようにします。

lst = list(generator_object)

ただし、オブジェクトを繰り返し処理するだけであれば、リストは必要ありません。

for item in generator_object:
    # do something with item

例えば、

sqr = (i**2 for i in xrange(10)) # <generator object <genexpr> at 0x1196acfa0>
list(sqr) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

sqr = (i**2 for i in xrange(10))
for x in sqr:
    print x,
# 0 1 4 9 16 25 36 49 64 81
20
Julien Spronck

ジェネレーター式をリストに変換するには、次の操作で十分です。

list(<generator expression>)

ただし、ジェネレータ式で無限リストを生成できる場合は、期待どおりの結果が得られないことに注意してください。

3
Mats Kindahl