Как внутри цикла сменить ключ-значение, когда кончаются значения подходящие под условие?
Задача заключается в том, что бы когда к примеру все 'Двухместные' значения были удалены из списка словаря, юзеру давало свободный 'Трёхместный' и так далее. Возможно вы найдёте альтернативный подход к решению задачи, за что тоже буду благодарен, единственное условие - это обязательное применение словаря и цикла(можно for).
RESERVATION = {'Двухместные': 'A1 A2 A3 A4 A5 A6'.split(),
'Трёхместные': 'B1 B2 B3 B4 B5'.split(),
'Четырехместные': 'C1 C2 C3 C4 '.split(),
'Пятиместные': 'D1 D2 D3 '.split()}
flag = True
while flag:
print('Сколько вас будет человек?(1-10)')
users = int(input('Нас будет\t'))
if users > 10:
print('Не более 10 человек!')
continue
if users <= 5:
if users == 1 or users == 2:
made = RESERVATION['Двухместные'].pop()
print('Ваш столик %s \n' % made)
elif users == 3:
made = RESERVATION['Трёхместные'].pop()
print('Ваш столик %s \n' % made)
elif users == 4:
made = RESERVATION['Четырехместные'].pop()
print('Ваш столик %s \n' % made)
elif users == 5:
made = RESERVATION['Пятиместные'].pop()
print('Ваш столик %s \n' % made)
elif users > 5:
print('Подождите')
flag = False
Ответы (2 шт):
RESERVATION = {2: 'A1 A2 A3 A4 A5 A6'.split(),
3: 'B1 B2 B3 B4 B5'.split(),
4: 'C1 C2 C3 C4 '.split(),
5: 'D1 D2 D3 '.split()}
while True:
print('Сколько вас будет человек?(1-10)')
users = int(input('Нас будет\t'))
if users > 10:
print('Не более 10 человек!')
continue
if users <= 5:
for k, v in RESERVATION.items():
if users <= k and v:
print(f"Ваш столик:{RESERVATION[k].pop()}")
break
elif users > 5:
print('Подождите, вас слишком много.')
print("Доступные столики")
for k, v in RESERVATION.items():
print(f"{k} местные: {v}")
print("*" * 20)
Из вашего описания непонятно что делать если больше 5.
Могу предложить такой вариант сортировки столиков и раздачи клиентам. Работает с любым числом гостей.
В цикле стоим список, в котором определяем для каждого типа столиков через разницу между числом гостей и вместимостью столика. Берем все положительные разницы, проверяя параллельно в словаре по столам их наличие. После по списку берем максимальный по вместительности столик.
В случае, когда список будет пустым, заначит мы пришли к моменту, когда число гостей меньше вместимости ближайшего стола. В этом случае получаем исключение и берем этот ближний столик.
После проверяем не заняты ли все столы и уходим на новый цикл рассадки остатков гостей.
reservation = {2: 'A1 A2 A3 A4 A5 A6'.split(),
3: 'B1 B2 B3 B4 B5'.split(),
4: 'C1 C2 C3 C4 '.split(),
5: 'D1 D2 D3 '.split()}
table_types = sorted(list(reservation))
def table_reservation(tables: dict, guests: int):
while guests > 0:
try:
count = max([t for t in tables if guests - t >= 0 and tables[t]])
except ValueError:
count = next((t for t in tables if tables[t]), None)
if not count:
print(f'Все столики кончились, число ожидаюших {guests}')
break
table = tables[count].pop(0)
print(f'Ваш столик {table} \n')
guests -= count
return tables
print('Сколько вас будет человек?(1-10)')
users = int(input('Нас будет\t'))
free_tables = table_reservation(reservation, users)
print(free_tables)
Вывод
Сколько вас будет человек?(1-10)
Нас будет 16
Ваш столик D1
Ваш столик D2
Ваш столик D3
Ваш столик A1
{2: ['A2', 'A3', 'A4', 'A5', 'A6'], 3: ['B1', 'B2', 'B3', 'B4', 'B5'], 4: ['C1', 'C2', 'C3', 'C4'], 5: []}
Кстати, если раздавать надо начинать с малых столов, то функция упрощается
def table_reservation(tables: dict, guests: int):
while guests > 0:
count = next((t for t in tables if guests - t >= 0 and tables[t]), None)
if not count:
print(f'Все столики кончились, число ожидаюших {guests}')
break
table = tables[count].pop(0)
print(f'Ваш столик {table} \n')
guests -= count
return tables
тогда раздача пойдет со столов А к D