Pythonでリストを反復するときに開始インデックスを設定する最良の方法は何ですか。たとえば、曜日(日曜日、月曜日、火曜日、...土曜日)のリストがありますが、月曜日からリストを反復処理したいと考えています。これを行うためのベストプラクティスは何ですか?
islice
には、リストの一部をコピーする必要がないという利点があります
from itertools import islice
for day in islice(days, 1, None):
...
従来のCスタイルのループのインデックスカウンターを使用して、いつでもループできます。
for i in range(len(l)-1):
print l[i+1]
通常は「すべての要素のループ」スタイルに従うのが良いのですが、それが邪魔になる場合は、常に従来のスタイルもサポートされていることを覚えておいてください。
stdlibは息子をつなぎます!
#!/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'])
入力シーケンスのワープコピーを作成する必要がない回転ジェネレーターを次に示します。入力シーケンスが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']
>>>
Monday
以降から印刷する場合は、list
のindex
メソッドを使用して、「Monday」がリスト内にある位置を見つけ、他で説明されているようにそこから反復できます。投稿。 list.index
を使用すると、潜在的なエラーの原因となる「月曜日」のインデックスをハードコーディングする必要がなくなります。
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
print d
「ラップアラウンド」して、月曜日より前にリストを効果的に回転させたい場合(月曜日より前のアイテムを切り捨てるのではなく):
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 )