Создайте словарь о людях и их увлечениях, т.е. {имя1: [хобби1, хобби2, ...], имя2: [...]}
def create_dictionary(data: str) -> dict:
dct = {}
for line in data:
d = line.strip().split(":")
if len(d) > 1:
if d[0] in dct:
dct[d[0]].append(d[1])
else:
dct[d[0]] = [d[1]]
return dct
sample_data = """Jack:crafting\nPeter:hiking\nWendy:gaming\nMonica:tennis\nChris:origami\nSophie:sport\nMonica:design\nCarmen:sport\nChris:sport\nMonica:skateboarding\nCarmen:cooking\nWendy:photography\nMonica:tennis\nCooper:yoga\nWendy:sport\nCooper:movies\nMonica:theatre\nCooper:yoga\nChris:gaming\nMolly:fishing\nJack:skateboarding\nWendy:fishing\nJack:drawing\nMonica:baking\nSophie:baking\nAlfred:driving\nAlfred:shopping\nAlfred:crafting\nJack:drawing\nCarmen:shopping\nCarmen:driving\nPeter:drawing\nCarmen:shopping\nWendy:fitness\nAlfred:travel\nJack:origami\nSophie:design\nJack:pets\nCarmen:dance\nAlfred:baking\nSophie:sport\nPeter:gaming\nJack:skateboarding\nCooper:football\nAlfred:sport\nCooper:fitness\nChris:yoga\nWendy:football\nMolly:design\nJack:hiking\nMonica:pets\nCarmen:photography\nJack:baking\nPeter:driving\nChris:driving\nCarmen:driving\nPeter:theatre\nMolly:hiking\nWendy:puzzles\nJack:crafting\nPeter:photography\nCarmen:theatre\nSophie:crafting\nCarmen:cooking\nAlfred:gaming\nPeter:theatre\nCooper:hiking\nChris:football\nChris:pets\nJack:football\nMonica:skateboarding\nChris:driving\nCarmen:pets\nCooper:gaming\nChris:hiking\nJack:cooking\nPeter:fishing\nJack:gaming\nPeter:origami\nCarmen:movies\nSophie:driving\nJack:sport\nCarmen:theatre\nWendy:shopping\nCarmen:pets\nWendy:gaming\nSophie:football\nWendy:theatre\nCarmen:football\nMolly:theatre\nPeter:theatre\nMonica:flowers\nMolly:skateboarding\nPeter:driving\nSophie:travel\nMonica:photography\nCooper:cooking\nJack:fitness\nPeter:cooking\nChris:gaming"""
dic = create_dictionary(sample_data)
print("shopping" in dic["Wendy"]) # -> True
print("fitness" in dic["Sophie"]) # -> False
print("gaming" in dic["Peter"]) # -> True
print(len(dic["Jack"])) # -> 12
print(len(dic["Carmen"])) # -> 10
print(len(dic["Molly"])) # -> 5
print(len(dic["Sophie"])) # -> 7
что-то явно делаю не так. Можете помочь? Не должно быть повторяющихся увлечений на 1 человеке.
:param data: заданная строка из базы данных
:return: словарь, где ключами являются люди, а значениями являются списки увлечений
Ответы (2 шт):
for line in data:
А почему вы думаете, что строка автоматически разобьётся и проитерируется по переводам строки? Так будет только если data - это файл. А строку вы должны сами разбить по переводам строки:
for line in data.split('\n'):
^^^^^^^^^^^^
def create_dictionary(data: str) -> dict:
dct = {}
for line in data.split('\n'):
d = list(map(str.strip, line.split(":")))
if len(d) > 1:
dct[d[0]] = dct.get(d[0], []) + [d[1]]
return dct
dic = create_dictionary(sample_data)
print("shopping" in dic["Wendy"]) # -> True
print("fitness" in dic["Sophie"]) # -> False
print("gaming" in dic["Peter"]) # -> True
print(len(set(dic["Jack"]))) # -> 12
print(len(set(dic["Carmen"]))) # -> 10
print(len(set(dic["Molly"]))) # -> 5
print(len(set(dic["Sophie"]))) # -> 7
ваши ошибки
вы не разбиваете строку на строки по разделителю '\n' в самом начале:
for line in data.split('\n'):от вас требуется найти уникальные значения, а вы выдаете полное кол-во
print(len(set(dic["Jack"]))) # -> 12чисто для удобства - заполнение списка можно сделать и в одну строку через метод
get, а не в 4 как у вас:dct[d[0]] = dct.get(d[0], []) + [d[1]]
Если же сразу писать в множество, а не в список, то код можно сделать таким:
if len(d) > 1:
dct[d[0]] = set.union(dct.get(d[0], set())).union([d[1]])
ну и
strip()можно применить не к начальной строке, а к строкам, которые получаются из нее - это понадежнееd = list(map(str.strip, line.split(":")))