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