Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 20, 2017 23:05:14

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Сортировка словаря

 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). места словарь занимает больще, чем список. преимущество словаря - доступ по ключу быстрее чем перебор списка при больших объемах данных
http://slusar.su/izuchaem-python-6-slovari/

Офлайн

#2 Дек. 21, 2017 01:30:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Сортировка словаря

  
>>> 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)

Офлайн

#3 Янв. 1, 2018 14:02:54

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря

С Новым годом, форумчане!
Небольшой вопрос для тех, кто уже проспался!
есть словарь:

 dict1 = {
'вслово1' : {
            '2010' : [1, 2],
            '2000' : [3, 4]
            },
'аслово2' : {
            '2010' : [11, 22],
            '2000' : [33, None]}
        } 
Пользователь делает запрос на интересующий его год (например 2000) и получает в ответ:
>>>вслово1 3 4
>>>аслово2 33 None
Мое решение такое, но чувствую, что есть явно более элегантный вариант
 while  True:
    inquiry = input('введите запрос ')
    if inquiry == 'exit': break
    for i in dict1:
         print(i, dict1[i][inquiry][0], dict1[i][inquiry][1]) 
А теперь нужно еще отсортировать данные при выводе по величине первого элемента вложенного словаря (сортировка между 3 и 33). Не изменяя исходный dict1 (ну или как минимум он должен остаться словарем) и, желательно, не создавая новых переменных. т.е. должно вывестись:
>>>аслово2 33 None
>>>вслово1 3 4

Отредактировано SomethingButNotNickName (Янв. 1, 2018 14:12:03)

Офлайн

#4 Янв. 1, 2018 14:10:11

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Сортировка словаря

SomethingButNotNickName
Не изменяя исходный dict1 (ну или как минимум он должен остаться словарем) и желательно не создавая новых переменных.
Ага, еще добавьте что ваш код изменять нельзя, особенно это будет полезно тем что ваш код не просто не элегантный, он просто неправильный (не соответствует словесному описанию).

Пишите когда будете готовы менять структуры данных и переписывать код.



Офлайн

#5 Янв. 1, 2018 14:20:42

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря

doza_and
Я несколько раз правил исходное задание, возможно вы увидели сообщение между правками и там было “что-то не соответствующее описанию”. В данный момент все так, как должно быть.
Касательно “не изменять исходный словарь” в чем проблема? Изменять код,естественно, можно. Для того и пишу сюда.

Офлайн

#6 Янв. 1, 2018 15:33:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Сортировка словаря

SomethingButNotNickName
возможно вы увидели сообщение между правками и там было
Да так и было. Сейчас только не удовлетворяется сортировка при выводе.
SomethingButNotNickName
Касательно “не изменять исходный словарь, не вводить новых переменных” в чем проблема?
Если вы не будете уточнять требования к коду, ограничите время запуска, время поиска, требования к потребляемой памяти и т.п. то по сути ни в чем. Если ваш код работает, требования удовлетворены то нет повода его менять. Ровно с той-же точки зрения я считаю требования не изменять исходный словарь, не вводить новых переменных идиотскими. Никого не должно волновать как работает программа и как она устроена если она работает правильно. Внутренние структуры данных это существенная часть алгоритма, если вы запрещаете их менять то нет смысла ваш алгоритм править.

К сказанному надо относиться филосовски, как и любое категорическое утверждение оно не совсем верно. Если этот словарик это внешний интерфейс к данным, если у вас так мало памяти что нельзя вводить новых переменных то совсем другое дело.

По сути если вам нужен интерфейс для быстрого поиска данных, то надо создавать индекс для выполнения таких запросов те новые переменные. Если вам нужны упорядоченные данные то надо пользоваться упорядоченными списками а не словарями. Если этого делать нельзя, то уточните почему. Только тогда можно будет посоветовать решение.



Отредактировано doza_and (Янв. 1, 2018 15:35:01)

Офлайн

#7 Янв. 1, 2018 15:34:27

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря

С печатью словаря вроде разобрался

 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)

Офлайн

#8 Янв. 1, 2018 15:58:32

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря

По условию задачи:
функция А - анализирует файл и создает словарь с данными.
функция Б - работает в цикле и делает следующее:
1) принимает, созданный функцией А словарь;
2) принимает у пользователя запрос;
3) выдает интересующую инфу.
Таким образом, входящий в функцию Б словарь не должен ею (функцией Б) меняться, иначе она не сможет с ним работать при втором и последующих запросах. Поправьте если я не прав. Отсюда родилось требование неизменности типа данных.
Теперь про переменные и “элегантность”. Опять же поправьте, если в чем то не прав, но:
1) простое лучше сложного => чем меньше переменных тем лучше;
2) понятное лучше не понятного => код должен быть читаем и прост.
С переменными все понятно, если без них не обойтись, то без них не обойтись. Создаем и пользуемся. Вариант как отсортировать с созданием нового списка у меня есть, не готовый, но в какую строну думать понимание есть. Именно поэтому “желательно не создавать новых переменных”.
Понятность и элегантность.
На мой дилетантский взгляд присутствие в коде конструкций типа

  dict1[i][inquiry][0] 
сильно ухудшает читабельность. А если это все еще засунуть в форматированный вывод то вообще без поллитры не разобраться.
Затронутая Вами тема скорости работы, конечно, тоже актуальна. Я полагаю, что код с тремя вложенными циклами(вариант 2) будет медленнее, чем код с 1 циклом (вариант 1). Поправьте если не прав.
И тут нас конфликт : одно быстрее - другое проще. Что лучше с высоты вашего опыта?

Отредактировано SomethingButNotNickName (Янв. 1, 2018 16:01:33)

Офлайн

#9 Янв. 1, 2018 20:26:29

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Сортировка словаря

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)

Вопрос как создать такой словарь выходит за рамки предоставленной вами информации, поскольку файл вы не дали.

Условия:
1 - выполнено это словарь
2 - вы сами решили тут тоже ок
3 - информация выдается и в отсортированном виде
Пожелания
1 - переменных больше не стало
2 - код проще, более того он намного эффективнее циклов прохода по словарю.

Так что смотрите может пригодится.

p.s.
отдельный интересный вопрос:
SomethingButNotNickName
словарь не должен ею (функцией Б) меняться, иначе она не сможет с ним работать при втором и последующих запросах
Опять-таки важно чтобы результат был правильный. Тогда наплевать что данные изменяются. Вывод о необходимости неизменности структур данных неверен. Есть такой прием мемоизация, кеширование, он широко применяется для повышения быстродействия. При его использовании постоянно происходит перестройка структур используемых данных.



Отредактировано doza_and (Янв. 1, 2018 20:41:54)

Офлайн

#10 Янв. 3, 2018 12:12:38

SomethingButNotNickName
Зарегистрирован: 2017-12-19
Сообщения: 75
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка словаря

doza_and
Вероятно мне нужно было сразу привести весь текст задания. И так.
“”“Упражнение ”Детские имена“
ЗАГС г. Москвы ведет статистику детских имен. На сайте этой организации
публикуется статистика наиболее популярных имен по году рождения ребенка.
Файлы для этого упражнения находятся в файлах ”babynames_boys.html“ и
”babynames_girls.html". Они содержат сырой HTML-код.
1. Создайте функцию extract_names(filename), которая принимает в качестве
аргумента имя файла и возвращает данные из него в виде словаря вида:
  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],
    },
    ...
}
2. Создайте функцию print_names(). Функция получает в качестве аргумента
словарь babynames.Затем:
1. Запрашивает у пользователя интересующий его год.
2. Выдает запрошенную инфу, но выдача сортируется по кол-ву детей и форматируется следующим образом:
  
София, Софья    3841   6,0%
Мария, Марья    3735   5,8%
...
Виктория        2219
Полина          2051
...
3. Функция print_names() работает в цикле : запрос - вывод инфы, до прерывания посредством команды от поьзователя.

Поэтому предлагаемое Вами изменение структуры словаря сильно упрощает мою задачу (и такая организация словаря логичнее и компактнее), но нарушает условие.
Теперь собственно решение.
1) Файл проанализирован и словарь создан.
2) Простой вывод у меня тоже получился (и насколько я понимаю замечаний к нему нет)
3) Осталась сортировка. Создавать из нашего словаря babynames сортированный список и уже его печатать не хочу, ибо жопой чую, что это костыль и есть более простые способы.
F1F1F!
Как вариант можно из требуемой структуры словаря создать новый, с Вашей структурой, и уже с ним работать…. Но мне кажется, что это опять же костыль.

Отредактировано SomethingButNotNickName (Янв. 3, 2018 12:17:16)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version