web-dev-qa-db-ja.com

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

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

65

スライス を使用できます。

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

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

141
Björn Pollex

islice には、リストの一部をコピーする必要がないという利点があります

from itertools import islice
for day in islice(days, 1, None):
    ...
32
John La Rooy

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

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

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

12
Lakshman Prasad

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'])
8

入力シーケンスのワープコピーを作成する必要がない回転ジェネレーターを次に示します。入力シーケンスが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']
>>>
3
John Machin

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

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

「ラップアラウンド」して、月曜日より前にリストを効果的に回転させたい場合(月曜日より前のアイテムを切り捨てるのではなく):

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 )
0
slothrop