6

コンテナーに対して複数の反復を実行する正しい方法は何ですか? Pythonのドキュメントから:

Iterator - コンテナー オブジェクト (リストなど) は、 iter() 関数に渡すか for ループで使用するたびに、新しい反復子を生成します。イテレータでこれを試みると、前のイテレーション パスで使用されたのと同じ使い果たされたイテレータ オブジェクトが返され、空のコンテナのように見えます。

プロトコルの意図は、反復子の next() メソッドが StopIteration を発生させると、後続の呼び出しでも引き続き発生させることです。このプロパティに従わない実装は壊れていると見なされます。(この制約は Python 2.3 で追加されました。Python 2.2 では、この規則に従ってさまざまな反復子が壊れています。)

このコードがある場合:

slist = [1,2,3,4]
rlist = reversed(slist)
list(rlist)
#[4,3,2,1]
tuple(rlist)
#()

「rlist」を 2 回繰り返す最も簡単で正しい方法は何でしょうか?

4

4 に答える 4

7
rlist = list(reversed(slist))

その後、必要なだけ繰り返します。このトリックはより一般的に適用されます。イテレータを複数回繰り返す必要があるときはいつでも、それをリストに変えてください。まさにこの目的のために、さまざまなプロジェクトにコピーアンドペーストし続けるコードスニペットを次に示します。

def tosequence(it):
    """Turn iterable into a sequence, avoiding a copy if possible."""
    if not isinstance(it, collections.Sequence):
        it = list(it)
    return it

(Sequenceは、リスト、タプル、および多くのカスタム リストのようなオブジェクトの抽象型です。)

于 2013-04-19T15:36:43.963 に答える
5

リストを2回保存することはありません。リストを組み合わせて1回繰り返すことができない場合は、

slist = [1,2,3,4]
for element in reversed(slist):
    print element  # do first iteration stuff
for element in reversed(slist):
    print element  # do second iteration stuff

reversed() は、slist に逆方向反復子を設定するものと考えてください。逆は安い。そうは言っても、逆にする必要がある場合は、逆にしてそのように保管するだけです.

于 2013-04-19T15:38:20.243 に答える
4

コンテナーに対して複数の反復を実行する正しい方法は何ですか?

2回続けてやるだけ。問題ない。

「rlist」を 2 回繰り返す最も簡単で正しい方法は何でしょうか?

あなたにとってうまくいかない理由は、それが「コンテナ」でrlist はないからです。

方法に注意してください

list(slist) # another copy of the list
tuple(slist) # still works!

したがって、簡単な解決策は、複数回反復する必要がある場合に、アイテムの実際のコンテナーがあることを確認することです。

rlist = list(reversed(slist)) # we store the result of the first iteration
# and then that result can be iterated over multiple times.

どうしてもアイテムを保管してはならない場合は、 を試してくださいitertools.tee。ただし、次の反復を開始する前に 1 つの完全な反復を完了する必要がある場合は、アイテムの格納を避けることはできないことに注意してください。一般的なケースでは、ストレージはこれらの制限の下では避けられません。

于 2013-04-19T15:49:42.050 に答える
1

元のリストをその場で単純に反転し ( slist.reverse())、それを何度でも反復し、最後に再び元のリストを取得するためにもう一度反転してみませんか?

これがうまくいかない場合、逆の順序でリストを反復するための最良の解決策は、反復する必要があるたびに新しい逆反復子を作成することです

for _ in xrange(as_many_times_as_i_wish_to_iterate_this_list_in_reverse_order):
    for x in reversed(slist):
        do_stuff(x)
于 2013-04-19T16:01:23.270 に答える