Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you sort a dictionary by value?

I often have to sort a dictionary (consisting of keys & values) by value. For example, I have a hash of words and respective frequencies that I want to order by frequency.

There is a SortedList which is good for a single value (say frequency), that I want to map back to the word.

SortedDictionary orders by key, not value. Some resort to a custom class, but is there a cleaner way?

like image 333
Kalid Avatar asked Aug 02 '08 00:08

Kalid


People also ask

How do you sort a dictionary by value then 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.

How do you sort a dictionary by value descending?

Use dict. items() to get a list of tuple pairs from d and sort it using a lambda function and sorted(). Use dict() to convert the sorted list back to a dictionary. Use the reverse parameter in sorted() to sort the dictionary in reverse order, based on the second argument.


2 Answers

Use LINQ:

Dictionary<string, int> myDict = new Dictionary<string, int>(); myDict.Add("one", 1); myDict.Add("four", 4); myDict.Add("two", 2); myDict.Add("three", 3);  var sortedDict = from entry in myDict orderby entry.Value ascending select entry; 

This would also allow for great flexibility in that you can select the top 10, 20 10%, etc. Or if you are using your word frequency index for type-ahead, you could also include StartsWith clause as well.

like image 155
caryden Avatar answered Sep 22 '22 13:09

caryden


Use:

using System.Linq.Enumerable; ... List<KeyValuePair<string, string>> myList = aDictionary.ToList();  myList.Sort(     delegate(KeyValuePair<string, string> pair1,     KeyValuePair<string, string> pair2)     {         return pair1.Value.CompareTo(pair2.Value);     } ); 

Since you're targeting .NET 2.0 or above, you can simplify this into lambda syntax -- it's equivalent, but shorter. If you're targeting .NET 2.0 you can only use this syntax if you're using the compiler from Visual Studio 2008 (or above).

var myList = aDictionary.ToList();  myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value)); 
like image 29
Leon Bambrick Avatar answered Sep 18 '22 13:09

Leon Bambrick