Squeak.ru - шаблоны программирования

Заказать Python Dict по свойству объекта в значении?

У меня есть python dict, который выглядит так

people {"mykey1": myCustomObject, "mykey2": myCustomObject }

В myCustomObject у меня есть поле целочисленного идентификатора. Так что похоже

class myCustomObject:
    def __init__(self, myID, firstName, lastName):
        self.ID = myID
        self.FirstName = firstName
        self.LastName = lastName

Можно ли заказать этот словарь по свойству ID в пользовательском объекте???

26.01.2014

  • dict экземпляров никогда нельзя заказать. 26.01.2014
  • @IgnacioVazquez-Abrams За исключением случаев, когда это возможно, с помощью OrderedDict, который будет экземпляром dict (проверьте!: >>> import collections; d = collections.OrderedDict(); isinstance(d, dict) True 26.01.2014
  • @AaronHall: На самом деле это просто случайность реализации, что OrderedDict является подклассом dict, поэтому вам, вероятно, не следует на это полагаться; если вы хотите проверить, является ли объект похожим на словарь, используйте вместо этого isinstance(d, MutableMapping). Но, очевидно, вы правы в том, что не должны предполагать, что это не подкласс dict, особенно учитывая, что на самом деле он им является и задокументирован как таковой. :) 28.01.2014
  • @abarnert Я знаю, я просто умничаю. :) Я только что реализовал MutableMapping без наследования dict в ответ на другой вопрос (который я случайно задал себе здесь: stackoverflow.com/questions/21361106/) 28.01.2014

Ответы:


1

dict по своей сути имеет произвольный порядок.

Если вы просто хотите получить доступ к нему в определенном порядке один раз, вы можете просто отсортировать его. Если вы не знаете, как сортировать данные, используя порядок, отличный от порядка по умолчанию, прочитайте Сортировка КАК. Но в основном:

for k, v in sorted(d.items(), key=lambda kv: kv[1].ID):
    print('{}: {}'.format(k, v))

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

d1 = { your original dict }
d2 = collections.OrderedDict()
for key in sorted(d1, key=lambda k: d1[k].ID):
    d2[key] = d1[key]

Вы можете упростить это до одной строки, если понимаете понимание:

d2 = OrderedDict(sorted(d1.items(), key=lambda kv: kv[1].ID))

Варианты подобных примеров показаны в документах в разделе OrderedDict Примеры и Рецепты.

Если вместо этого вы хотите, чтобы словарь поддерживал отсортированный порядок, вам понадобится какой-то класс отсортированного словаря. В stdlib такого класса нет, но в ActiveState и PyPI доступно множество опций. Некоторые из них реализованы как OrderedDict, которые пересортировываются каждый раз, когда вы их обновляете (или, иногда, при первом доступе к ним после обновления, что позволяет использовать длинную цепочку обновлений, чтобы избежать длинной цепочки сортировок). Другие используют bisect или дерево поиска (например, бинарное красно-черное дерево или 10-арное B-дерево) для вставки элементов в нужное место.

26.01.2014
  • Отличный ответ, спасибо. Лямбда-выражение определенно дало мне то, что мне нужно. 26.01.2014
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...