Python: сортировать списки в списках списков, где один список является ключом к сортировке

скажем, у меня есть диктатор

d = { u'a': [1, 4, 6, 7], u'b': [9, 9, 9, 8], u'c': ['g', 'a', 'b', '9'], u'd': [5, 1, 10, 2], } 

Я хочу сортировать одновременно списки внутри этого словаря, где ключ для сортировки является значением в списке d[u'd'] позволяет сказать, что результатом сортировки будет

 new_d = { u'a': [4, 7, 1, 6], u'b': [9, 8, 9, 9], u'c': ['a', '9', 'g', 'b'], u'd': [1, 2, 5, 10] <- we have sorted by that list } 

 from operator import itemgetter srt_key = [i for i, e in sorted(enumerate(d["d"]), key=itemgetter(1))] new_d = {} for k,v in d.items(): new_d[k] = list(itemgetter(*srt_key)(v)) print(new_d) {'c': ['a', '9', 'g', 'b'], 'a': [4, 7, 1, 6], 'b': [9, 8, 9, 9], 'd': [1, 2, 5, 10]} 

Или с помощью dict comp:

 new_d = {k: list(itemgetter(*srt_key)(v)) for k,v in d.items()} print(new_d) 

Во-первых, отдельные ключи и значения в dict

 >>> keys, values = zip(*d.items()) 

Теперь zip значения, добавив список ключей в качестве первого столбца

 >>> zip(d[u"d"], *values) [(5, 1, 'g', 9, 5), (1, 4, 'a', 9, 1), (10, 6, 'b', 9, 10), (2, 7, '9', 8, 2)] 

Сортировка значений по первому столбцу (ключевому списку)

 >>> sorted(_) [(1, 4, 'a', 9, 1), (2, 7, '9', 8, 2), (5, 1, 'g', 9, 5), (10, 6, 'b', 9, 10)] 

Затем zip результат сортировки назад и разделите ключ-столбец

 >>> zip(*_)[1:] [(4, 7, 1, 6), ('a', '9', 'g', 'b'), (9, 8, 9, 9), (1, 2, 5, 10)] 

zip снова с помощью клавиш для восстановления словаря.

 >>> dict(zip(keys, _)) {u'a': (4, 7, 1, 6), u'b': (9, 8, 9, 9), u'c': ('a', '9', 'g', 'b'), u'd': (1, 2, 5, 10)} 

Все вместе:

 keys, values = zip(*d.items()) new_d = dict(zip(keys, zip(*sorted(zip(d[u"d"], *values)))[1:])) 

Вы можете построить new_d следующим образом:

 In [9]: new_d = {} In [10]: for k in d.keys(): new_d[k] = [x for (y,x) in sorted(zip(d[u'd'],d[k]), key=lambda pair: pair[0])] ....: In [11]: new_d Out[11]: {u'a': [4, 7, 1, 6], u'b': [9, 8, 9, 9], u'c': ['a', '9', 'g', 'b'], u'd': [1, 2, 5, 10]} 

Этот подход объединяет элементы из каждого списка со списком, управляющим порядком сортировки, и сортирует список пар последним.