Почему перезаписывается (обнуляется значение) словарь?
Есть задача и код который я уже написал:
3. Написать функцию thesaurus(),
принимающую в качестве аргументов имена сотрудников и возвращающую словарь,
в котором ключи — первые буквы имен, а значения — списки, содержащие имена,
начинающиеся с соответствующей буквы.
Например:
# >>> >>> thesaurus("Иван", "Мария", "Петр", "Илья")
{
"И": ["Иван", "Илья"],
"М": ["Мария"], "П": ["Петр"]
}
Подумайте: полезен ли будет вам оператор распаковки?
Сможете ли вы вернуть отсортированный по ключам словарь?
def thesaurus(*names):
list_name = [*names]
dictionary = {}
list_name_1 = []
for name in list_name:
name.capitalize()
char = name[0]
dict_1 = {char : name}
dictionary.update(dict_1)
return dictionary
print(thesaurus("Майа", "Дарси", 'Макс'))
У меня обнуляется значение "Майа", не знаю как сделать, чтобы оставить ее внутри.
Пожалуйста, не пишите ответы с лямбдой и прочим, я новичек и не пойму, а мне хочется понять как решить, а не списать с вопросами о том, что это. Буду очень благодарен.
Ответы (4 шт):
Автор решения: MaxU
→ Ссылка
попробуйте так:
from collections import defaultdict
def thesaurus(*names):
res = defaultdict(list)
for x in names:
res[x[0]].append(x)
return dict(res)
Автор решения: MaxU
→ Ссылка
более простой вариант и без использования модулей:
def thesaurus(*names):
res = {}
for name in names:
key = name[0].capitalize()
if key not in res:
res[key] = []
res[key].append(name)
return res
Автор решения: Namerek
→ Ссылка
names = ["Майа", "Дарси", 'Макс', "Макс"]
names_dict_set = dict()
names_dict_list = dict()
for name in names:
first_letter = name[0].upper()
# Первый вариант с множеством. Исключаем дублирование имени.
names_dict_set[first_letter] = names_dict_set.setdefault(first_letter, set()) | {name.capitalize()}
# Второй вариант со списком. Возможны дублирующие записи в списке
names_dict_list[first_letter] = names_dict_list.setdefault(first_letter, []) + [name.capitalize()]
print(names_dict_set, names_dict_list, sep='\n')
# {'М': {'Майа', 'Макс'}, 'Д': {'Дарси'}}
# {'М': ['Майа', 'Макс', 'Макс'], 'Д': ['Дарси']}
Автор решения: asanisimov
→ Ссылка
def thesaurus(*names):
# set убирает дублирующие имена а title() приводит все к одному виду (майя, МАЙЯ, Майя запишутся как 1 имя Майя)
set_names = {name.title() for name in names}
first_letter = [name[0].upper() for name in set_names]
# как описано в других примерах - результат (словарь) можно было реализовать с помощью from collections import defaultdict,
# но так как мы знаем уже все ключи я бы прдпочел этот способ
result_dict = {k: list() for k in first_letter}
for name in set_names:
result_dict[name[0]].append(name)
return result_dict
print(thesaurus("Майа", "Дарси", 'Макс', 'Макс'))