Уведомления

Группа в Telegram: @pythonsu

#1 Май 20, 2023 22:22:47

kriks
Зарегистрирован: 2017-08-03
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите пожалуйста дописать код.

Всем привет. Помогите пожалуйста.
Пишу потихоньку генератор графика дежурств:

 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)
Получаю такой вывод:

Сотрудник1:
Сотрудник2:
Сотрудник3:
Сотрудник4:
А как сделать чтобы получилось:
Сотрудник1:
Сотрудник2:
Сотрудник3:
Сотрудник4:
Сотрудник1:

Офлайн

#2 Май 21, 2023 02:15:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Помогите пожалуйста дописать код.

  
>>> 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]}
>>> 



Офлайн

#3 Май 21, 2023 20:57:45

kriks
Зарегистрирован: 2017-08-03
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите пожалуйста дописать код.

py.user.next
Это немного не то.
Извиняюсь за прошлый код:
Вывод у меня получился такой

Сотрудник1: 1,2
Сотрудник2: 8,9
Сотрудник3: 15,16
Сотрудник4: 22,23, 29,30
А как сделать чтобы получилось:
Сотрудник1: 1,2
Сотрудник2: 8,9
Сотрудник3: 15,16
Сотрудник4: 22,23
Сотрудник1: 29,30

Офлайн

#4 Май 21, 2023 23:22:55

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Помогите пожалуйста дописать код.

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
>>>



Офлайн

#5 Май 22, 2023 13:36:23

kriks
Зарегистрирован: 2017-08-03
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите пожалуйста дописать код.

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))))
Больщое спасибо за помощь!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version