Улучшение понимания списка Python для устранения вложенных массивов - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь создать понимание списка, которое улучшит то, что у меня уже есть.

У меня есть список чисел, представляющих длины месяца.

months = [35, 28, 28, 35, 28, 28, 35, 28, 28, 35, 28, 28] 

Я хочу расширить этот массив в массив с длиной полного года, и каждое значение в этом массиве, представляющее, к какой неделе относится этот день (индекс).

В настоящее время я делаю это с двумя списками.

weeks = [w for w in range(sum(months)) if w % 7 == 0]
weeks_expanded = [day for week in [[d + 1] * 7 for d in range(len(weeks))] for day in week]

Я хотел знать, как я мог бы добавить что-то в новый список 7 раз, не делая его массивом длины 7. Я пытаюсь избавиться от дополнительного шага, заключающегося в выравнивании моего внутреннего понимания списка в days_expanded. [[d + 1] * 7 for d in range(len(weeks))]

Спасибо за помощь.

1 Ответ

0 голосов
/ 16 мая 2018

В основном вы генерируете последовательность каждого седьмого числа для последовательности weeks, вплоть до общего количества дней в году, поэтому это тоже работает:

weeks = range(0, sum(months), 7)

weeks_expanded список простопоследовательность повторяющихся целых чисел, начиная с 1, каждое повторяется 7 раз, вплоть до sum(months) // 7 включительно, так что вы можете просто сделать это:

weeks_expanded = [wn for wn in range(1, (sum(months) // 7) + 1) for __ in range(7)]

Это использует вложенный цикл в понимании списка, чтопросто повторяется 7 раз.Вы также можете использовать итератор itertools.product() , чтобы сгладить это в один цикл:

from itertools import product

weeks_expanded = [wn for wn, __ in product(range(1, (sum(months) // 7) + 1), (None,) * 7)]

. Для добавления повторения используется кортеж из 7 None ссылок, затем циклигнорирует эти значения.

Ни одна из версий не нуждается в weeks.

...