Форум сайта python.su
for i in sorted(dict1): print(i,dict1[i])
>>>
аслово2 [11, 22, 33, 44, 55]
бслово3 [111, 222, 333, 444, 555]
вслово1 [1, 2, 3, 4, 5]
>>>
SomethingButNotNickNameвообще функция словаря - поиск значения по уникальному ключу(hash). места словарь занимает больще, чем список. преимущество словаря - доступ по ключу быстрее чем перебор списка при больших объемах данных
Словарь занимает сильно меньше места чем список? Или тут другие причины называемого условием задачи хранения инфы в виде словаря?
Офлайн
>>> import collections >>> >>> dict1 = {'вслово1': [1, 2, 3, 4, 5], ... 'аслово2': [11, 22, 33, 44, 55], ... 'бслово3': [111, 222, 333, 444, 555]} >>> >>> odict1 = collections.OrderedDict(sorted(dict1.items())) >>> odict1 OrderedDict([('аслово2', [11, 22, 33, 44, 55]), ('бслово3', [111, 222, 333, 444, 555]), ('вслово1', [1, 2, 3, 4, 5])]) >>>
SomethingButNotNickNameПри многократном поиске в большом словаре каждый поиск будет занимать очень короткое время. Для поиска в словаре не нужно перебирать все его элементы, там как бы внутренняя структура есть, которая даёт возможность искать в словаре очень быстро. А при поиске в списке или кортеже происходит перебор всех элементов по очереди при каждом поиске, пока не будет найден искомый.
Или тут другие причины называемого условием задачи хранения инфы в виде словаря?
Отредактировано py.user.next (Дек. 21, 2017 01:40:02)
Офлайн
С Новым годом, форумчане!
Небольшой вопрос для тех, кто уже проспался!
есть словарь:
dict1 = { 'вслово1' : { '2010' : [1, 2], '2000' : [3, 4] }, 'аслово2' : { '2010' : [11, 22], '2000' : [33, None]} }
while True: inquiry = input('введите запрос ') if inquiry == 'exit': break for i in dict1: print(i, dict1[i][inquiry][0], dict1[i][inquiry][1])
Отредактировано SomethingButNotNickName (Янв. 1, 2018 14:12:03)
Офлайн
SomethingButNotNickNameАга, еще добавьте что ваш код изменять нельзя, особенно это будет полезно тем что ваш код не просто не элегантный, он просто неправильный (не соответствует словесному описанию).
Не изменяя исходный dict1 (ну или как минимум он должен остаться словарем) и желательно не создавая новых переменных.
Офлайн
doza_andЯ несколько раз правил исходное задание, возможно вы увидели сообщение между правками и там было “что-то не соответствующее описанию”. В данный момент все так, как должно быть.
Офлайн
SomethingButNotNickNameДа так и было. Сейчас только не удовлетворяется сортировка при выводе.
возможно вы увидели сообщение между правками и там было
SomethingButNotNickNameЕсли вы не будете уточнять требования к коду, ограничите время запуска, время поиска, требования к потребляемой памяти и т.п. то по сути ни в чем. Если ваш код работает, требования удовлетворены то нет повода его менять. Ровно с той-же точки зрения я считаю требования не изменять исходный словарь, не вводить новых переменных идиотскими. Никого не должно волновать как работает программа и как она устроена если она работает правильно. Внутренние структуры данных это существенная часть алгоритма, если вы запрещаете их менять то нет смысла ваш алгоритм править.
Касательно “не изменять исходный словарь, не вводить новых переменных” в чем проблема?
Отредактировано doza_and (Янв. 1, 2018 15:35:01)
Офлайн
С печатью словаря вроде разобрался
while True: inquiry = input('введите запрос ') if inquiry == 'exit': break for i in dict.keys(dict1): for j, el in dict.items(dict1[i]): if j == inquiry: print('%-16s' % i, end='') for i in el: print ('%-5s' % i, end='') print()
Отредактировано SomethingButNotNickName (Янв. 1, 2018 15:34:53)
Офлайн
По условию задачи:
функция А - анализирует файл и создает словарь с данными.
функция Б - работает в цикле и делает следующее:
1) принимает, созданный функцией А словарь;
2) принимает у пользователя запрос;
3) выдает интересующую инфу.
Таким образом, входящий в функцию Б словарь не должен ею (функцией Б) меняться, иначе она не сможет с ним работать при втором и последующих запросах. Поправьте если я не прав. Отсюда родилось требование неизменности типа данных.
Теперь про переменные и “элегантность”. Опять же поправьте, если в чем то не прав, но:
1) простое лучше сложного => чем меньше переменных тем лучше;
2) понятное лучше не понятного => код должен быть читаем и прост.
С переменными все понятно, если без них не обойтись, то без них не обойтись. Создаем и пользуемся. Вариант как отсортировать с созданием нового списка у меня есть, не готовый, но в какую строну думать понимание есть. Именно поэтому “желательно не создавать новых переменных”.
Понятность и элегантность.
На мой дилетантский взгляд присутствие в коде конструкций типа
dict1[i][inquiry][0]
Отредактировано SomethingButNotNickName (Янв. 1, 2018 16:01:33)
Офлайн
SomethingButNotNickNameСначала проще, и если не укладываемся в ТЗ то усложняем.
Что лучше с высоты вашего опыта?
SomethingButNotNickNameПо такому ТЗ трудно понять что за файл и что за данные. Словарь можно создать разными способами, в задании сказано проанализировать.
функция А - анализирует файл и создает словарь с данными.
dict1 = { 2000 : [ ['аслово2' ,[33, None]], ['вслово1' ,[3, 4]] ], 2010: [ ['аслово2' ,[1, 2]], ['вслово1' ,[11, 22]] ] }
for word,lst in dict1[key]: print(word,lst)
SomethingButNotNickNameОпять-таки важно чтобы результат был правильный. Тогда наплевать что данные изменяются. Вывод о необходимости неизменности структур данных неверен. Есть такой прием мемоизация, кеширование, он широко применяется для повышения быстродействия. При его использовании постоянно происходит перестройка структур используемых данных.
словарь не должен ею (функцией Б) меняться, иначе она не сможет с ним работать при втором и последующих запросах
Отредактировано doza_and (Янв. 1, 2018 20:41:54)
Офлайн
doza_andВероятно мне нужно было сразу привести весь текст задания. И так.
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], }, ... }
София, Софья 3841 6,0% Мария, Марья 3735 5,8% ... Виктория 2219 Полина 2051 ...
Отредактировано SomethingButNotNickName (Янв. 3, 2018 12:17:16)
Офлайн