Форум сайта python.su
может как то так? я задал словарь вручную поэтому год в списке типа int а у вас при чтении из файла будет str что при сортировке даст другой результат. думаю эту задачу решите
babynames = { 'София, Софья': { 2012: [3841, 6.0], 2010: [3668, 6.2], 2005: [2127, 4.8], 2000: [826, 2.4], 1990: [193, 0.4]}, 'Виктория': { 2012: [2219, None], 2010: [1994, None], 2005: [1829, None], 2000: [1076, None], 1990: [1033, None]}, 'Мария, Марья' : { 2012: [3735 ,5,8], 2010: [1994, None], 2005: [1829, None], 2000: [1076, None], 1990: [1033, None],} } def print_names(babynames ): def selekt(key): if year in babynames[key].keys(): return [key] + [ x for x in babynames[key][year] if x ] year = int(input('-->>> ')) result = [selekt(key) for key in babynames] for i in sorted(result,key = lambda x : x[1],reverse = True): print(*i) print_names(babynames)
Отредактировано marvellik (Янв. 3, 2018 15:36:44)
Офлайн
marvellikНу результат выдается корректный.
может как то так? я задал словарь вручную поэтому год в списке типа int а у вас при чтении из файла будет str что при сортировке даст другой результат. думаю эту задачу решите
Офлайн
суть в том что в задании требуют вывод результата в сортированном виде по убыванию. для этого совсем не обязательно сортировать весь словарь. тупо идем по словарю и если в значении есть требуемый год то все требуемые для вывода данные собираем в список в результате получаем список из таких списков который сортируем по значению-количеству и выводим результат.
Офлайн
>>> babynames = { ... 'София, Софья': { ... 2012: [3841, 6.0], ... 2010: [3668, 6.2], ... 2005: [2127, 4.8], ... 2000: [826, 2.4], ... 1990: [193, 0.4], ... }, ... 'Виктория': { ... 2012: [2219, None], ... 2010: [1994, None], ... 2005: [1829, None], ... 2000: [1076, None], ... 1990: [1033, None], ... }, ... 'Полина': { ... 2012: [2218, 1.0], ... 2010: [1993, 2.5], ... 2005: [1828, 3.0], ... 2000: [1075, 4.5], ... 1990: [1032, 5.0], ... }, ... } >>> >>> def search_by_year(data, year): ... return ([k] + v_data[year] for k, v_data in data.items() ... if year in v_data) ... >>> def sort_by_number(seq): ... return sorted(seq, key=lambda i: i[1], reverse=True) ... >>> def print_names(seq): ... for name, count, weight in seq: ... print('{:10}\t{}\t{}'.format(name, count, weight or '')) ... >>> print_names(sort_by_number(search_by_year(babynames, 2012))) София, Софья 3841 6.0 Виктория 2219 Полина 2218 1.0 >>>
Отредактировано py.user.next (Янв. 5, 2018 03:40:06)
Офлайн
Возник вопрос.
Ваш код:
py.user.nextЗачем третья строка?>>>>>> def search_by_year(data, year): ... return ([k] + v_data[year] for k, v_data in data.items() ... if year in v_data) ... >>> def sort_by_number(seq): ... return sorted(seq, key=lambda i: i[1], reverse=True) ... >>> def print_names(seq): ... for name, count, weight in seq: ... print('{:10}\t{}\t{}'.format(name, count, weight or '')) ... >>> print_names(sort_by_number(search_by_year(babynames, 2012))) София, Софья 3841 6.0 Виктория 2219 Полина 2218 1.0 >>>
... if year in v_data)
Офлайн
И еще вопрос.
Мне предложили два варианта решения marvellik и py.user.next.
Оба реализуют одну и ту же логику:
1) выбрать нужные данные из словаря в некий служебный список;
2) сортировать список;
3) напечатать результат.
В обоих случаях выполняются одни и те же действия => время работы будет одинаково, так?
Но в случае решения marvellik'a этот список реально существует, под него выделена переменная, к нему можно обратиться после окончания работы функции. А у py.user.next списку не дано имени, он существует только внутри функций, и насколько я понимаю, после окончания работы функции стирается из памяти.
Соответственно решение от py.user.next более рационально с точки зрения экономии памяти, так?
Офлайн
SomethingButNotNickNameЕсли у кого-то запрашиваемый год есть, а кого-то запрашиваемого года нет, то того, у кого года нет, не надо включать в результат и обрабатывать не надо. А того, у кого год есть, надо включить в результат, только перед этим ещё обработать там, чтобы результат был простым и чтобы не нужно было потом копаться в нём, чтобы что-то достать.
Зачем третья строка?
SomethingButNotNickNameПри сортировке список всё равно будет воссоздан, потому что сортировка через sorted() не может отсортировать на лету, ей нужно обязательно все элементы перебрать в каждом случае. Поэтому там возвращается список всегда, даже если ты подавал итератор какой-нибудь.
Но в случае решения marvellik'a этот список реально существует, под него выделена переменная, к нему можно обратиться после окончания работы функции. А у py.user.next списку не дано имени, он существует только внутри функций, и насколько я понимаю, после окончания работы функции стирается из памяти.
Отредактировано py.user.next (Янв. 9, 2018 02:05:33)
Офлайн