Рассмотрим словарь:
sample_dict={1:'r099',2:'g444',3:'t555',4:'f444',5:'h666'}
Я хочу переупорядочить этот словарь в порядке, указанном списком, содержащим порядок ключей словаря, которые я желаю. Скажем, нужный список заказов:
desired_order_list=[5,2,4,3,1]
Итак, я хочу, чтобы мой словарь выглядел следующим образом:
{5:'h666',2:'g444',4:'f444',3:'t555',1:'r099'}
Если я могу получить список значений, это тоже хорошо. Значение, результат может быть следующим:
['h666','g444','f444','t555','r099']
Как я могу достичь этого наименее сложным способом?
Словари Python неупорядочены.
Используйте OrderedDict вместо этого.
Если вы используете OrderedDict
, вы можете сделать
for key in [5,2,4,3,1]:
my_ordered_dict[key] = my_ordered_dict.pop(key)
Это вставляет все в вашем упорядоченном dict в последовательности, которую вы хотите, чтобы позже вы могли сделать
my_ordered_dict.values()
И получите список, который вы предложили в вопросе.
Если вы завернете повторную установку в try: ...; except KeyError: pass
, вы можете изменить порядок OrderedDict
, даже если не все ключи в вашем списке присутствуют.
В чем смысл переупорядочения словаря для вас? Словари - это неупорядоченные структуры данных по своей природе - они используются для поиска, а не для заказа.
Вы хотите выполнить итерацию по словарю в определенном порядке? Затем просто используйте desired_order_list
:
for key in desired_order_list:
# d is the dictionary
# do stuff with d[key]
Как уже упоминалось, у Python есть OrderedDict
(в версии 2.7 или 3.x), но я не думаю, что вам здесь нужно. "Переупорядочение" просто слишком неэффективно. Гораздо лучше просто переносить свой словарь вместе со списком ключей в желаемом порядке вместе.
Если вы все еще настаиваете на OrderedDict
, просто создайте новый OrderedDict
, вставив в него значение в порядке desired_order_list
.
Использование решения OrderedDict или Eli, вероятно, будет хорошим способом, но для справки - простой способ получить список значений, которые вы хотите:
[sample_dict[k] for k in desired_order_list]
Если вы не полностью уверены, что каждый элемент из desired_order_list
будет ключом в sample_dict
, используйте либо [sample_dict.get(k) ...]
, либо [... for k in desired_order_list if k in sample_dict]
. Первый метод поместит None
для пропущенных ключей, второй метод будет включать только значения из ключей в dict.
Используйте SortedDict
, предоставляемый django (from django.utils.datastructures import SortedDict
). SortedDict
хранит его заказ в атрибуте keyOrder
(который является только списком, поэтому вы можете изменить его порядок в любое время).
Если у вас нет django, установленного или не используемого для django, просто поднимите реализацию django.utils.datatstructures
. Это не зависит от каких-либо других частей django.
collections.OrderedDict
?