Перебор списка со смещением начальной точки - PullRequest
0 голосов
/ 03 октября 2018

Используя Python3, мне нужно последовательно перебирать список элементов, начиная с произвольного i (i <= 6), завершать полный цикл итерации, повторять его, начиная с i + = 1 и так далее.Этот цикл не должен заканчиваться.По содержанию это получение названий дней недели, начиная с текущего.Например, если сегодня среда, в результате итераций мне нужно получить список [среда, четверг, пятница, суббота, воскресенье, понедельник, вторник].Вроде бы все просто, но я в тупике.Буду благодарен за подсказку или помощь. </p>

Ответы [ 4 ]

0 голосов
/ 03 октября 2018
from itertools import chain, dropwhile, repeat


def endless_daynames(starting_day):
    daynames = [
        'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
        'Friday', 'Saturday', 'Sunday']
    # get starting day name 
    starting_day_name = daynames[starting_day] 
    # creating an endless iterable from an origin list
    endless_list = chain.from_iterable(repeat(daynames))
    # drop first items before we meet a required one
    shifted_list = dropwhile(lambda x: x != starting_day_name, endless_list)
    # yield values from it
    yield from shifted_list
0 голосов
/ 03 октября 2018

Обычно вы можете эффективно использовать оператор по модулю % в таких циклических сценариях:

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

i = 2  # Wednesday

while True:
    print(days[i])
    i += 1
    i = i % len(days)  # 7 => 0

Wednesday
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
...
0 голосов
/ 03 октября 2018

Если я правильно понял, вы пытаетесь получить дни недели в любой данный день. Вы можете передать название дней недели и получить список в том же порядке.Пожалуйста, посмотрите на это: -

from collections import deque
def rotate_week(week_days):
    a = deque(["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"])
    d = {}
    for i in range(len(a)):
        d[a[i]] = i
    number_to_rotate = d.get(week_days)
    a.rotate(-number_to_rotate)
    print(list(a))
rotate_week('Wednesday')

Выведите как: -

['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
0 голосов
/ 03 октября 2018

Вы можете использовать itertools.chain и itertools.cycle, чтобы получить бесконечную итерацию, которая производит желаемую последовательность:

from itertools import chain, cycle

for x in chain(the_list[i:], cycle(the_list)):
    print(x)

Используется как:

>>> from itertools import chain, cycle
>>> the_list = range(10)
>>> i = 6
>>> for x in chain(the_list[i:], cycle(the_list)):
...     print(x)
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
[... forever ...]

Эквивалентно использовать cycle + islice:

>>> for x in islice(cycle(the_list), i, None):
...     print(x)
>>> for x in islice(cycle(the_list), i, 20):
...     print(x)
... 
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
[... forever ...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...