Python: сортировка OrderedDictionary на основе длины значения ключа

У меня есть такой объект:

t = {'rand_key_1': ['x'], 'rand_key_2': [13,23], 'rand_key_3': [(1)], 'rk5': [1,100,3,4,3,3]}

словарь со случайными ключами (строка и / или int), которые ВСЕ имеют список в качестве значения, с различными размерами.

Я хочу превратить этот словарь в OrderedDict, который упорядочен в зависимости от длины списка элементов словаря. Поэтому после заказа хочу получить:

t_ordered = {'rk5': ..., 'rand_key_2': .., 'rand_key_1': .., 'rand_key_3': ..}

(если два или более предметов имеют одинаковую стоимость, их порядок не имеет значения.

Я пробовал это, но у меня не получается:

OrderedDict(sorted(d, key=lambda t: len(t[1])))

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

Что я могу сделать?

Спасибо.

4 ответа

Решение

Вы были очень близки с функцией сортировки, которую вы передали sorted, Следует отметить, что сортировка будет возвращать целое число ключей словаря по порядку. Так что, если мы исправим вашу функцию индексирования словаря с каждым ключом:

>>> sorted(t, key=lambda k: len(t[k]))
['rand_key_3', 'rand_key_1', 'rand_key_2', 'rk5']

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

>>> for sorted_key in sorted(t, key=lambda k: len(t[k]), reverse=True):
...     print sorted_key, t[sorted_key]

rk5 [1, 100, 3, 4, 3, 3]
rand_key_2 [13, 23]
rand_key_3 [1]
rand_key_1 ['x']

Обычно вам не нужно создавать OrderedDict, поскольку вы просто перебираете новый отсортированный список, используя самые последние данные словаря.

Сначала используйте простую сортировку по словарю, а затем OrderedDict():

>>> from collections import OrderedDict as od
>>> k=sorted(t, key=lambda x:len(t[x]), reverse=True)
>>> k
['rk5', 'rand_key_2', 'rand_key_3', 'rand_key_1']

>>> od((x, t[x]) for x in k)
OrderedDict([('rk5', [1, 100, 3, 4, 3, 3]), ('rand_key_2', [13, 23]), ('rand_key_3', [1]), ('rand_key_1', ['x'])])

Так как упорядоченный словарь запоминает порядок вставки, вы можете сделать это:

OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))

OrderedDict в Python - это коллекция, которая запоминает порядок, в котором элементы были вставлены. Упорядоченный в этом контексте не означает отсортированный.

Если все, что вам нужно, это собрать все предметы в отсортированном порядке, вы можете сделать что-то вроде этого:

for key, value in sorted(t, key = lambda x: -len(x[0])):
  # do something with key and value

Однако вы все еще используете несортированную структуру данных - просто перебираете ее в отсортированном порядке. Это по-прежнему не поддерживает такие операции, как поиск k-го элемента, преемника или предшественника элемента в dict,

Другие вопросы по тегам