Как лучше всего установить начальный индекс при итерации списка в Python. Например, у меня есть список дней недели - воскресенье, понедельник, вторник, ... суббота, - но я хочу перебирать список, начиная с понедельника. Как лучше всего это делать?
88
Ответы:
Вы можете использовать нарезку :
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 подключит тебя, сын!
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'])
источник
Если все , что вы хотите, чтобы напечатать от
Monday
года, вы можете использоватьlist
«sindex
метод , чтобы найти место , где„понедельник“находится в списке, и итерация оттуда , как объяснено в других постах. Использование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 )
источник