2017-04-20 11 views
1

私はこのような書き込みものに苦しんでいます:ジェネレータを受け入れられないのはなぜですか?

ジェネレータが吸う
list(reversed(list(el.iterancestors()))) + [1,2,3] 

、私はリストにそれらを消費することを余儀なくしていますので。

これを簡略化する方法はありますか?私はreversed()はイテレータを受け入れるべきだと私は間違っていると思いますか?

答えて

9

ジェネレータには最後のアイテムがあることが保証されていないため、元に戻すことはできません。次の結果はどうなるでしょうか? reversed()のポイントはメモリ効率的であることを

from itertools import permutations 
reversed(permutations('abcdefghijklmnopqrstuvwxyz', 10)) # 19,275,223,968,000 tuples 

注:

from itertools import cycle 

reversed(cycle('abc')) 

誤ってすべてのあなたの記憶を食べることの危険性もあります。シーケンスの場合、インデックス(リスト、文字列、タプル、範囲)を持つオブジェクトのように、reversed()は内部インデックスを使用するイテレータを生成します。内部インデックスはlen(inputobject) - 1で始まり、反復処理を行うときには0に進みます。そのように入力シーケンスのコピーを作成する必要はありませんが、そのトリックはすでに長さがあり、ランダムアクセスをサポートしているものに対してのみ機能します。

あなたのケースのために私はとにかくreversed()使用しないと思います。あなたは、出力ではなく、発電機などのリストをしたいので、代わりにリストを逆にスライスを使用します。新しいリストオブジェクトを構築しているよう

list(el.iterancestors())[::-1] + [1, 2, 3] 

メモリ効率が、ここでは問題ではありません。

関連する問題