2017-01-16 10 views
-1

У меня есть словарь, который выглядит следующим образом:Как отсортировать dict по определенному местоположению в списке в его значении?

d1= {'a':[1, 5], 'b':[2, 23], 'c':[99,12]} 

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

for key in sorted(mydict, key=mydict.get, reverse=True): 
    print key.rstrip() + " : " + str(mydict[key]) 

Это на самом деле все еще работает для первой значение в списке, но он ничего не делает для второго значения:

c : [99, 12] 
b : [2, 23] 
a : [1, 5] 

Как может Я сортирую по второму значению в списке вместо этого? Как я могу сортировать по второму значению THEN первое значение, или наоборот, если я так выбираю?

+1

В словаре нет порядка: вы не можете отсортировать словарь. Вы можете преобразовать его только в список. –

+0

Хороший путеводитель [Python: «Сортировка КАК»] (https://docs.python.org/3.6/howto/sorting.html) – MSeifert

+0

Вы можете использовать упорядоченный словарь (из «коллекций»), чтобы обеспечить ключи и значения находятся в каком-то порядке. В противном случае заказ не будет сохранен. – rotten

ответ

1

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

Тем не менее, вы можете просто использовать выражение lambda в key:

 
for key in sorted(mydict, key=lambda x: (mydict.get(x)[1],mydict.get(x)[0]), reverse=True): 
    print key.rstrip() + " : " + str(mydict[key]) 

Что происходит здесь вы берете в качестве «ключа» о том, как сортировать значения, то получим значение, вызвав mydict.get(x), теперь вы можете постройте новый кортеж (mydict.get(x)[1],mydict.get(x)[0]), где первый элемент помещается первым, а первый - вторым.

Поскольку кортежи , отсортированные по лексикографическому заказу, это означает, что Python будет сначала сравнивать первый элемент и в случае привязки второго элемента. Теперь, когда мы поменяли местами, он, таким образом, сначала сравним второй, а затем и первый.

Вы можете, однако, как говорит @ Жан-FrançoisFabre, используйте [::-1] для обратного кортеж Запоминание .get операцию (и результат выглядит более элегантно) так:

 
for key in sorted(mydict, key=lambda x: mydict.get(x)[::-1], reverse=True): 
    print key.rstrip() + " : " + str(mydict[key]) 

Заметим, однако, что более элегантный способом решения этой проблемы было бы немедленно отсортировать кортежи с ключом:

 
for key,value in sorted(mydict.items(), key=lambda x:x[1][::-1], reverse=True): 
    print key.rstrip() + " : " + str(value) 
+1

этот вид только в соответствии со вторым значением, первое значение не принимается во внимание. –

+0

@ Jean-FrançoisFabre: А я вижу, я пропустил этот момент. Будет обновлен ответ. –

+0

Я думаю, что 'key = lambda x: (x [1] [1], x [1] [0])' будет делать это. Вероятно, стоит упомянуть, что упорядоченные контейнеры сравнивали лексикографически –

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

  • Нет связанных вопросов^_^