Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort keys in dictionary by value in a list in Python

I have seen this post and this post as well as many others, but haven't quite found the answer to my question nor can I figure it out.

I have a dictionary of lists. For example it looks like:

Dict = {'a':[1,2,3,4], 'b':[9,8,7,6], 'c':[8,5,3,2]}

I want to return a list of the keys sorted (descending/reverse) based on a specific item in the lists. For example, I want to sort a,b,c based on the 4th item in each list.

This should return the list sorted_keys = ['b','a','c'] which were sorted by values [6,4,2].

Make sense? Please help...thanks!

like image 457
mcfly Avatar asked Apr 22 '13 17:04

mcfly


People also ask

Can you sort the keys in a dictionary Python?

In Python sorted() is the built-in function that can be helpful to sort all the iterables in Python dictionary. To sort the values and keys we can use the sorted() function. This sorted function will return a new list.

How do you sort multiple values in a dictionary Python?

Sort Dictionary Using the operator Module and itemgetter() This function returns the key-value pairs of a dictionary as a list of tuples. We can sort the list of tuples by using the itemgetter() function to pull the second value of the tuple i.e. the value of the keys in the dictionary.

How do you sort a dictionary by value and then by key?

The key=lambda x: (x[1],x[0]) tells sorted that for each item x in y. items() , use (x[1],x[0]) as the proxy value to be sorted. Since x is of the form (key,value) , (x[1],x[0]) yields (value,key) . This causes sorted to sort by value first, then by key for tie-breakers.


1 Answers

Supply a key function, a lambda is easiest, and sort reversed:

sorted(Dict.keys(), key=lambda k: Dict[k][3], reverse=True)

The key function tells sorted what to sort by; the 4th item in the value for the given key.

Demo:

>>> sorted(Dict.keys(), key=lambda k: Dict[k][3], reverse=True)
['b', 'a', 'c']
like image 192
Martijn Pieters Avatar answered Oct 10 '22 18:10

Martijn Pieters