Pythonリストを反復するための開始インデックス


88

Pythonでリストを反復するときに開始インデックスを設定するための最良の方法は何ですか。たとえば、曜日のリスト(日曜日、月曜日、火曜日、...土曜日)がありますが、月曜日からリストを繰り返し処理したいと思います。これを行うためのベストプラクティスは何ですか?


1
土曜日までループしたいですか、それとも最後に日曜日をラップして印刷したいですか?
juanchopanza 2011年

土曜日までループしたかっただけです。Pythonリストでスライスを使用できることに今まで気づいていませんでした。
Vincent Catalano

リストだけでなく、ジェネレーター/イテラブルも処理するソリューションはありますか?それとも本当に大きなリストですか?
チャーリーパーカー

回答:


174

あなたはスライスを使うことができます:

for item in some_list[2:]:
    # do stuff

これは3番目の要素から始まり、最後まで繰り返されます。


2
これはまさに私が探していたものです。ありがとう!
Vincent Catalano

30
これは大きなリストには非効率的ではありませんか?このスライス操作では、参照されているリスト要素を新しいリストにコピーする必要があると思います。
UndeadKernel 2014年

4
はい、これは大きなリストには非効率的です。コピーされない解決策については、以下のgnibblersの回答を参照してください。
ビョルンPollex

ジェネレーター/イテラブルを使用してループしている場合、これをどのように行うのですか?
チャーリーパーカー

2
isliceJohn La Rooyの回答で示唆されているように、を使用する必要があります。
ビョルンポレックス2017


13

従来のCスタイルのループでは、インデックスカウンターを使用していつでもループできます。

for i in range(len(l)-1):
    print l[i+1]

「すべての要素のループ」スタイルに従うことは通常のことなので、常に行う方が良いですが、それが邪魔になる場合は、従来のスタイルも常にサポートされていることを覚えておいてください。


9

stdlibはあなたを息子に引っ掛けます!

deque.rotate()

#!/usr/local/bin/python2.7

from collections import deque

a = deque('Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '))
a.rotate(3)
deque(['Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'])

4

Monday以降に印刷するだけの場合は、listindex方法を使用して「月曜日」がリスト内の位置を見つけ、他の投稿で説明されているようにそこから繰り返すことができます。を使用list.indexすると、エラーの潜在的な原因である「月曜日」のインデックスをハードコーディングする必要がなくなります。

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d

本当に素晴らしい解決策!
aderchox

3

これは、入力シーケンスのワープコピーを作成する必要のない回転ジェネレータです...入力シーケンスが7項目よりもはるかに大きい場合に役立つことがあります。

>>> def rotated_sequence(seq, start_index):
...     n = len(seq)
...     for i in xrange(n):
...         yield seq[(i + start_index) % n]
...
>>> s = 'su m tu w th f sa'.split()
>>> list(rotated_sequence(s, s.index('m')))
['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
>>>

はい-そして、無限の繰り返しシーケンスを生成するために簡単に拡張できます。
slothrop 2011年

@JohnMachinに感謝せずにはいられません:この264年で亡くなった人のための素晴らしい仕事
jjon 2015

1

リストスライス(新しいリストにコピーされるため遅い)を使用したり、ライブラリ関数をインポートしたり、このために配列を回転させようとしたりするのはなぜですか?

通常のforループをrange(start, stop, step)startおよびstepはオプションの引数)とともに使用します。

たとえば、インデックス1から始まる配列をループします。

for i in range(1, len(arr)):
    print(arr[i])

0

「ラップアラウンド」して、リストを効果的にローテーションして月曜日から開始する場合(月曜日より前にアイテムを切り落とすのではなく):

dayNames = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
            'Friday', 'Saturday',  ]

startDayName = 'Monday'

startIndex = dayNames.index( startDayName )
print ( startIndex )

rotatedDayNames = dayNames[ startIndex: ] + dayNames [ :startIndex ]

for x in rotatedDayNames:
    print ( x )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.