Как лучше всего установить начальный индекс при итерации списка в Python. Например, у меня есть список дней недели - воскресенье, понедельник, вторник, ... суббота, - но я хочу перебирать список, начиная с понедельника. Как лучше всего это делать?
Как лучше всего установить начальный индекс при итерации списка в Python. Например, у меня есть список дней недели - воскресенье, понедельник, вторник, ... суббота, - но я хочу перебирать список, начиная с понедельника. Как лучше всего это делать?
Ответы:
Вы можете использовать нарезку :
for item in some_list[2:]:
# do stuff
Это начнется с третьего элемента и будет повторяться до конца.
islice
, как это было предложено в ответе Джона Ла Роя.
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'])
Если все , что вы хотите, чтобы напечатать от Monday
года, вы можете использовать list
«s index
метод , чтобы найти место , где„понедельник“находится в списке, и итерация оттуда , как объяснено в других постах. Использование list.index
избавляет вас от жесткого кодирования индекса для «понедельника», что может быть потенциальным источником ошибок:
days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
print d
Вот генератор вращения, которому не нужно делать деформированную копию входной последовательности ... может быть полезен, если входная последовательность намного больше 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']
>>>
Почему люди используют нарезку списка (медленно, потому что копируется в новый список), импортируют библиотечную функцию или пытаются для этого повернуть массив?
Используйте обычный цикл for с range(start, stop, step)
(где start
и step
- необязательные аргументы).
Например, цикл по массиву, начиная с индекса 1:
for i in range(1, len(arr)):
print(arr[i])
Если вы хотите «обернуть» и эффективно повернуть список, чтобы начать с понедельника (а не просто отбрасывать элементы до понедельника):
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 )