Переупорядочить словарь в Python в соответствии со списком значений

1

Рассмотрим словарь:

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']

Как я могу достичь этого наименее сложным способом?

  • 1
    Вы на самом деле используете collections.OrderedDict ?
  • 3
    Вопрос нуждается в большем количестве !!!
Показать ещё 1 комментарий
Теги:
list
sorting
dictionary

5 ответов

3

Словари Python неупорядочены.

Используйте OrderedDict вместо этого.

  • 2
    Хорошо, но как мне переупорядочить их в определенном порядке?
2

Если вы используете 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, даже если не все ключи в вашем списке присутствуют.

2

В чем смысл переупорядочения словаря для вас? Словари - это неупорядоченные структуры данных по своей природе - они используются для поиска, а не для заказа.

Вы хотите выполнить итерацию по словарю в определенном порядке? Затем просто используйте 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.

1

Использование решения 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.

0

Используйте SortedDict, предоставляемый django (from django.utils.datastructures import SortedDict). SortedDict хранит его заказ в атрибуте keyOrder (который является только списком, поэтому вы можете изменить его порядок в любое время).

Если у вас нет django, установленного или не используемого для django, просто поднимите реализацию django.utils.datatstructures. Это не зависит от каких-либо других частей django.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню