Как решить задачу без большого числа переменных
Необходимо найти дни недели, когда никто не может работать, и для каждого дня найти количество сотрудников, которые могут дежурить в этот день. Вопрос по второму пункту. Как решить задачу без использования большого количества переменных, желательно, используя коллекции.
Вот код:
shedule = {
'1001': ['пн', 'вс'],
'1231': ['пн', 'вт'],
'1232': ['ср', 'чт', 'пт'],
'1280': ['ср', 'пт', 'вс'],
'1282': ['чт'],
'1290': ['пт', 'вс'],
'1303': ['вт', 'вс'],
}
unique_days = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс']
shedule_set1 = []
shedule_set = []
tmp = []
tmp1 = []
mon = 0
tue = 0
wed = 0
thu = 0
fri = 0
sat = 0
sun = 0
for j in shedule:
shedule_set1.append(shedule[j])
for i in shedule_set1:
tmp1.append(i)
for j in tmp1:
tmp = j
for m in tmp:
shedule_set.append(m)
for i in shedule_set:
if i == "пн":
mon += 1
elif i == "вт":
tue += 1
elif i == "ср":
wed += 1
elif i == "чт":
thu += 1
elif i == "пт":
fri += 1
elif i == "сб":
sat += 1
elif i == "вс":
sun += 1
shedule_set = set(shedule_set)
unique_days = set(unique_days)
print("В этот день никто не может дежурить:", unique_days.difference(shedule_set))
print("пн -", mon, "вт -", tue, "ср -", wed, "чт -", thu, "пт -", fri, "сб -", sat, "вс -", sun)
Ответы (3 шт):
а почему бы не объединить все в списки:
вместо
mon = 0
tue = 0
wed = 0
thu = 0
fri = 0
sat = 0
sun = 0
пусть будет
week_days = [0, 0, 0, 0, 0, 0, 0]
а вместо
if i == "пн":
mon += 1
elif i == "вт":
tue += 1
elif i == "ср":
wed += 1
elif i == "чт":
thu += 1
elif i == "пт":
fri += 1
elif i == "сб":
sat += 1
elif i == "вс":
sun += 1
использовать
day = {'пн': 0, 'вт': 1, 'ср': 2, 'чт': 3, 'пт': 4, 'сб': 5, 'вс': 6}
week_days[day[i]] += 1
или еще проще:
week_days = {'пн': 0, 'вт': 0, 'ср': 0, 'чт': 0, 'пт': 0, 'сб': 0, 'вс': 0}
...
week_days[i] += 1
...
и вместо
print("пн -", mon, "вт -", tue, "ср -", wed, "чт -", thu, "пт -", fri, "сб -", sat, "вс -", sun)
сделать:
print(', '.join(f"{item[0]} - {item[1]}" for item in week_days.items()))
или
print(*[f"{item[0]} - {item[1]}" for item in week_days.items()], sep=', ')
Тут логично использовать словарь вместо отдельных переменных, где ключ - день недели, значение - количество "попаданий" в день недели.
Пример на обычном словаре:
week = dict()
...
for i in shedule_set:
if i not in week:
week[i] = 0 # Если данный день еще не попадался, инициализируем нулём
week[i] += 1
shedule_set = set(shedule_set)
# unique_days тут не преобразовываем в set, чтобы сохранился порядок,
# и можно было в цикле вывести значения по порядку дней недели
print("В этот день никто не может дежурить:", set(unique_days).difference(shedule_set))
for day in unique_days:
print(day, "-", week[day], end=" ")
print()
Можно упростить через defaultdict:
from collections import defaultdict
...
week = defaultdict(int) # При запросе значение по отсутствующему ключу будет возвращать 0
...
for i in shedule_set:
week[i] += 1
shedule_set = set(shedule_set)
print("В этот день никто не может дежурить:", set(unique_days).difference(shedule_set))
for day in unique_days:
print(day, "-", week[day], end=" ")
print()
Или через Counter (он автоматом посчитает сколько раз каждый объект встретился в исходном списке или любой другой итерируемой последовательнсти):
from collections import Counter
...
week = Counter(shedule_set)
shedule_set = set(shedule_set)
print("В этот день никто не может дежурить:", set(unique_days).difference(shedule_set))
for day in unique_days:
print(day, "-", week[day], end=" ")
print()
Использовать Counter уже здесь предлагалось. Мне это тоже первым пришло в голову. Получилось как-то так:
from collections import Counter
shedule = {
'1001': ['пн', 'вс'],
'1231': ['пн', 'вт'],
'1232': ['ср', 'чт', 'пт'],
'1280': ['ср', 'пт', 'вс'],
'1282': ['чт'],
'1290': ['пт', 'вс'],
'1303': ['вт', 'вс'],
}
unique_days = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс']
c = Counter()
for k in shedule.values():
c += Counter(k)
print(*[f'{i} - {j}' for i,j in sorted(c.items(), key=lambda x: unique_days.index(x[0]))],sep='\n')
print('В этот день никто не может дежурить: ', ','.join(set(unique_days)-c.keys()))
результат:
пн - 2
вт - 2
ср - 2
чт - 2
пт - 3
вс - 4
В этот день никто не может дежурить: сб