Форум сайта python.su
Всем привет. Помогите пожалуйста.
Пишу потихоньку генератор графика дежурств:
import random import calendar from datetime import datetime, timedelta # структура данных для дежурств # ключи - люди, значения - список дежурств на выходные дни в месяце # в данном случае задаем имена людей на русском языке schedule = { 'Сотрудник1': [], 'Сотрудник2': [], 'Сотрудник3': [], 'Сотрудник4': [], } # задаем месяц и год year = 2023 month = 4 # количество выходных дней в месяце weekends_count = len( [1 for day in calendar.Calendar().itermonthdays2(year, month) if day[0] != 0 and day[1] == 5 or day[1] == 6] ) # количество людей в расписании people_count = len(schedule) # количество дежурств на одного человека person_weekend_assignments = weekends_count // people_count # проверяем, что дежурств достаточно для всех людей if person_weekend_assignments < 1: print('Недостаточно выходных дней в месяце для распределения дежурств') else: # создаем список выходных дней в месяце weekend_days = [day[0] for day in calendar.Calendar().itermonthdays2(year, month) if day[0] != 0 and (day[1] == 5 or day[1] == 6)] # равномерно распределяем дежурства по людям for i, (person, assignments) in enumerate(schedule.items()): start_index = i * person_weekend_assignments end_index = start_index + person_weekend_assignments if i == people_count - 1: end_index += weekends_count % people_count assignments.extend(weekend_days[start_index:end_index]) # выводим результат for person, assignments in schedule.items(): print(person + ':', assignments)
Офлайн
>>> import itertools >>> >>> weekends = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] >>> workers = {'worker1': [], 'worker2': [], 'worker3': []} >>> >>> days_one_part = 2 >>> days_groups = (weekends[i:i+days_one_part] ... for i in range(0, len(weekends), days_one_part)) >>> >>> workers_loop = itertools.cycle(workers.items()) >>> for i in days_groups: ... next(workers_loop)[1].extend(i) ... >>> print(workers) {'worker1': [1, 2, 7, 8, 13], 'worker2': [3, 4, 9, 10], 'worker3': [5, 6, 11, 12]} >>>
Офлайн
py.user.nextЭто немного не то.
Офлайн
kriksПоменял исходную структуру хранения данных
А как сделать чтобы получилось:Сотрудник1: 1,2
Сотрудник2: 8,9
Сотрудник3: 15,16
Сотрудник4: 22,23
Сотрудник1: 29,30
>>> import itertools >>> >>> weekends = [1, 2, 8, 9, 15, 16, 22, 23, 29, 30] >>> workers = ('Сотрудник1', 'Сотрудник2', 'Сотрудник3', 'Сотрудник4') >>> workers_with_days = [] >>> >>> days_one_part = 2 >>> days_groups = (weekends[i:i+days_one_part] ... for i in range(0, len(weekends), days_one_part)) >>> >>> workers_loop = itertools.cycle(workers) >>> for i in days_groups: ... workers_with_days.append((next(workers_loop), i)) ... >>> print(workers_with_days) [('Сотрудник1', [1, 2]), ('Сотрудник2', [8, 9]), ('Сотрудник3', [15, 16]), ('Сотрудник4', [22, 23]), ('Сотрудник1', [29, 30])] >>> >>> for worker_name, worker_days in workers_with_days: ... print('{}: {}'.format(worker_name, ', '.join(map(str, worker_days)))) ... Сотрудник1: 1, 2 Сотрудник2: 8, 9 Сотрудник3: 15, 16 Сотрудник4: 22, 23 Сотрудник1: 29, 30 >>>
Офлайн
py.user.nextБольщое спасибо за помощь!
>>> import itertools
>>>
>>> weekends =
>>> workers = ('Сотрудник1', ‘Сотрудник2’, ‘Сотрудник3’, ‘Сотрудник4’)
>>> workers_with_days =
>>>
>>> days_one_part = 2
>>> days_groups = (weekends
… for i in range(0, len(weekends), days_one_part))
>>>
>>> workers_loop = itertools.cycle(workers)
>>> for i in days_groups:
… workers_with_days.append((next(workers_loop), i))
…
>>> print(workers_with_days)
[('Сотрудник1', ), ('Сотрудник2', ), ('Сотрудник3', ), ('Сотрудник4', ), ('Сотрудник1', )]
>>>
>>> for worker_name, worker_days in workers_with_days:
… print('{}: {}'.format(worker_name, ‘, ’.join(map(str, worker_days))))
Офлайн