Python: сортировать словарь списков по умолчанию

#python #sorting #dictionary #defaultdict

#python #сортировка #словарь #defaultdict

Вопрос:

У меня есть словарь списков, которые мне нужно отсортировать по первому значению в списке. Я использую defaultdict.

 from collections import defaultdict
Dict = defaultdict(list)
Dict['A'].append([100, 'abcd'])
Dict['A'].append([50, 'bgfd'])
Dict['A'].append([150, 'abcd'])
  

Мне нужно выполнить итерацию по словарю упорядоченным образом, чтобы я получил:

 for Entry in Dict['A']:
     print Entry
  

Должно дать:

 [50, 'bgfd']
[100, 'abcd']
[150, 'abcd']
  

Комментарии:

1. Вы не можете сортировать словари, они неупорядочены. Что вы хотите сделать, так это отсортировать значения списка в defaultdict(list) . Это нормально, поскольку списки упорядочены . Вы можете получить отсортированную копию записи, используя sorted(Dict['A']) , или вы могли бы фактически изменить порядок содержимого одной из них, используя Dict['A'].sort() .

Ответ №1:

Просто используйте sorted и сортируйте список, хранящийся в Dict['A'] :

 >>> from collections import defaultdict
>>> Dict = defaultdict(list)
>>> Dict['A'].append([100, 'abcd'])
>>> Dict['A'].append([50, 'bgfd'])
>>> Dict['A'].append([150, 'abcd'])
>>>
>>> for Entry in sorted(Dict['A']):
...     print Entry
...
[50, 'bgfd']
[100, 'abcd']
[150, 'abcd']
>>>
  

Ответ №2:

Значение — это просто список, поэтому вы можете отсортировать его с помощью sorted() :

 for Entry in sorted(Dict['A']):
    print Entry
  

Сортировка является лексикографической по содержимому списка; поэтому сначала порядок определяется по list_a[0] vs list_b[0] , затем, если они совпадают, сравниваются элементы 1 и т.д.

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

ДЕМОНСТРАЦИЯ:

 >>> from collections import defaultdict
>>> Dict = defaultdict(list)
>>> Dict['A'].append([100, 'abcd'])
>>> Dict['A'].append([50, 'bgfd'])
>>> Dict['A'].append([150, 'abcd'])
>>> sorted(Dict['A'])
[[50, 'bgfd'], [100, 'abcd'], [150, 'abcd']]