2015-08-28 4 views
1

У меня есть два словаря, оба имеют одинаковые индексы, но разные значения. Мне нужен список ключей первого дикта, отсортированного по значению. Если есть связь, то предпочтительнее запись с более высоким значением во втором dict. В обоих словарей, тем выше значение лучшеМногофакторная сортировка словаря в python

Пример:

node_degree = {1: 4, 2: 5, 3: 2, 4: 4, 5: 2} 
node_volumes = {1: 100, 2: 200, 3: 300, 4: 400, 5: 500} 

Я мог сортировать словарь node_degree по значению, как это:

degree_list = sorted(node_degree, key=node_degree.get, reverse=True) 

который будет уступать [2, 1, 4, 3, 5]. Однако записи 1 и 4 имеют одинаковое значение (4), а во втором списке node_volumes значение узла 1 (100) меньше значения узла 4 (400). То же самое верно для узлов 3 и 5. Результат, следовательно, должен быть:

sortFunction(node_degree, node_volumes) = [2, 4, 1, 5, 3] 

Как достичь этого?

ответ

2

Это сорт, основанный на набор значений из первого и второго dicts:

degree_list = sorted(
    node_degree, 
    key=lambda k: (node_degree[k], node_volumes[k]), 
    reverse=True, 
) 
+0

протестирована и работает. Большое спасибо. –

+0

@Tom Dalton Я как бы потерян. Я понимаю, что «лямбда» возвращает кортеж. Но если мы поменяем значения типа '(node_volumes [k], node_degree [k])', он полностью изменяет результат. Что именно происходит там? – xyres

+0

Раздел «Основные функции» https://wiki.python.org/moin/HowTo/Sorting, вероятно, объясняет это лучше, чем я могу. В конечном счете, наша ключевая функция (лямбда) возвращает кортеж (степень, объем) для каждого элемента (ключа) в dict, который мы пытаемся сортировать. Кортежи сортируются по питону на основе правила «сортировка по первому элементу. Если совпадают первые элементы, сортировка по второму элементу. Если во втором элементе соответствует сортировка по третьему элементу ...», то неявным порядком этих кортежей является упорядочение что спрашивает. –

Смежные вопросы