Добавление и удаление ключей из словаря

Всем добрый вечер!

Есть словарь:

fruits = {
'apple': ['15'], 
'orange': ['25'], 
'melon': []}

После ввода пользователем определённых команд (add и del) нужно добавить новый введённый юзером ключ (предположим, 'pineapple') и удалить существующий (только если директория пустая, как в случае с 'melon'). В результате, и там, и там нужно вывести обновлённый список ключей (без значений).

В теории я знаю, как добавлять и удалять ключи в словаре, используя команды .update и .pop. Но я не могу сообразить, как добавить/удалить ключ, введённый непосредственно пользователем по команде.

Заранее спасибо за подсказки!


Ответы (5 шт):

Автор решения: Argo7

Вы это имеете ввиду?

b = {'a':1,
    'b':2,
    'c':3}
zet = input("New key: ")
b.update({zet:[]})
b.pop(zet)
→ Ссылка
Автор решения: Veronika Zalesskaya

Всё вышло, всё работает:

fruits = {
'apple': ['15'], 
'orange': ['25'], 
'melon': []}

p = input('Введите команду')
if p == 'add':
    fruit = input('Введите новый фрукт: ')
    fruits[fruit]=[]
    print(', '.join(fruits.keys()))

if p == 'del':
    fruit = input('Введите ненужный фрукт: ')
    del(fruits[fruit])
    print(', '.join(fruits.keys()))

Но есть парочка дополнительных условий, с которыми тоже нужна помощь:

  1. Если фрукт уже существует (при добавлении) или его нет в списке (при удалении), нужно вывести соответствующую команду.

  2. Если у ключа есть значение, удалять его нельзя. То есть удалить можно только ключ с пустым списком значений.

Не понимаю, какие if в данных случаях задавать. И можно ли создать общую функцию , чтобы не раздувать код?

→ Ссылка
Автор решения: Veronika Zalesskaya

Итак, я всё ещё мучаюсь со своими фруктами. Вот, что есть:

fruits = {
'apple': ['15'], 
'orange': ['25'], 
'melon': []}

def add_fruit(name):
    fruits[name] = []
    if name != fruits.keys():
        print('Фрукт добавлен. Текущий список: ', ', '.join(fruits.keys()))
    else:
        print('Такой фрукт уже существует')
    
def rem_fruit(name):
    fruits[name] = []
    if len(fruits[name]) == 0: 
        del(fruits[name])
        print('Фрукт удалён. Текущий список: ',', '.join(fruits.keys()))
    else:
        print('На складе ещё есть фрукты')

p = input('Введите команду: ')
if p == 'as':
    print(add_fruit(input('Введите фрукт: ')))

if p == 'ds':
    print(rem_fruit(input('Введите фрукт: ')))

Проблемы:

  1. У меня выполняется только условие по if. Почему else не срабатывает?

  2. Куда вставлять return?

Есть ли вариант ещё больше сократить код?

→ Ссылка
Автор решения: n1tr0xs

Вот такой код должен работать:

fruits = { 'apple': ['15'], 'orange': ['25'],  'melon': []}

def menu(p):
    if p == 'as':
        return add_fruit(input('Введите фрукт: '))
    elif p == 'ds':
        return rem_fruit(input('Введите фрукт: '))
    elif p == 's':
        return get_fruit(input('Введите номер фрукта: '))
    
def add_fruit(name):
    if name in fruits:
        return 'Такой фрукт уже существует'
    fruits[name] = []
    return 'Фрукт добавлен. Текущий список: ' + ', '.join(fruits.keys())

def rem_fruit(name):
    if name in fruits:
        if fruits[name]:
            return 'На складе ещё есть фрукты'
        del fruits[name]
        return 'Фрукт удалён. Текущий список: ' + ', '.join(fruits.keys())
    return 'Такого фрукта нет на складе'

def get_fruit(number):
    res = list(filter(lambda e: number in e[1], fruits.items()))
    return res[0] if res else 'Такой фрукт не существует'
    

p = input('Введите команду: ') 
print(menu(p))
→ Ссылка
Автор решения: Veronika Zalesskaya

Итак, есть всё тот же словарь:

fruits = {
'apple': ['15'], 
'orange': ['25'], 
'melon': []}

Есть функция, которая позволяет найти фрукт по его номеру:

def get_fruit(number):
    return list(filter(lambda e: number in e[1], fruits.items()))[0]

Используем мы её вот так:

p = input('Введите команду: ')
if p == 's':
    print(get_fruit(input('Введите номер фрукта: '))[0])

Но есть условие. Если пользователь вводит значение, которого не существует в словаре (к примеру, 33), вместо ошибки должно появиться сообщение "Такого фрукта не существует". Как ввести данное условие в функцию?

→ Ссылка