2016-07-29 5 views
2

は、このしていますか?スライスを列挙してサブリストのマテリアライゼーションを実行しますか?</p> <pre><code>for i,v in enumerate(lst[from:to]): </code></pre> <p>またはこの:</p> <pre><code>for i,v in enumerate(itertools.islice(lst,from,to)): </code></pre> <p>...反復サブリストのコピーを作成

+3

まずはい、二なし。 –

+3

実験をやってみませんか?反復処理するスライスを変更します。これは元のオブジェクトを変更しますか? –

+0

@JohnColeman 2番目のバージョンでどうしたらいいですか? –

答えて

2

lstは、通常のPythonのリストであり、かつnumpyの配列、パンダのデータフレーム、またはいくつかのカスタムクラスはスライスのインデックス作成をサポートしていないと仮定するとitertools.isliceがないのに対し、その後、スライス[...:...]は、新しいリストを作成します。

コメントで示唆したように、あなたはそれらを消費する前に、両方のenumerateオブジェクトを作成し、元のリストを変更することで、自分自身のためにこれを見ることができます:

>>> lst = [1, 2, 3, 4, 5] 
>>> e1 = enumerate(lst[1:4]) 
>>> e2 = enumerate(itertools.islice(lst, 1, 4)) 
>>> del lst[2] # remove second element 
>>> list(e1) 
[(0, 2), (1, 3), (2, 4)] # shows content of original list 
>>> list(e2) 
[(0, 2), (1, 4), (2, 5)] # second element skipped 

はまた、これは事実enumerateとは何の関係もないではないことに注意してください、どちらの場合でもジェネレータが作成されます(スライスによって以前に作成されたiterableの上に)。

また、単にスライスの二つの変種を作成し、その型をチェックすることができ:

>>> type(lst[1:4]) 
list # a new list 
>>> type(itertools.islice(lst, 1, 4)) 
itertools.islice # some sort of generator 
関連する問題

 関連する問題