Переупорядочить словарь в Python в соответствии со списком значений - PullRequest
5 голосов
/ 08 мая 2011

Давайте рассмотрим словарь:

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

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

Ответы [ 6 ]

4 голосов
/ 09 декабря 2014

Если вы используете 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 голосов
/ 27 августа 2018

Ответ на Python 3.6 +

Гвидо заверил, что словари будут заказываться с Python 3.7 и далее, и они уже были в качестве экспериментальной функции в 3.6. Ответ уже расширен в Самый быстрый способ сортировки словаря Python 3.7+ .

В этом случае создание нового дикта с простым пониманием словаря на основе элементов, содержащихся в desired_order_list, поможет.

sample_dict = {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}
print(sample_dict)
>>> {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}

desired_order_list = [5, 2, 4, 3, 1]

reordered_dict = {k: sample_dict[k] for k in desired_order_list}
print(reordered_dict)
>>> {5: 'h666', 2: 'g444', 4: 'f444', 3: 't555', 1: 'r099'}
2 голосов
/ 08 мая 2011

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

Хотите ли вы перебирать словарь в определенном порядке?Тогда просто используйте ваш 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.

2 голосов
/ 08 мая 2011

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

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

1 голос
/ 08 мая 2011

Использование OrderedDict или решение Эли , вероятно, будет хорошим способом, но для справки приведем простой способ получить список значений, которые вы хотите:

[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 голосов
/ 08 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...