I have a dictionary of type <string, string>
and for a particular case, I need to do a reverse lookup. So for instance suppose I have this entry <"SomeString", "ab">
and that I pass in "ab"
then I would like to return "SomeString"
. Before I embark on a foreach
loop over every entry in the dictionary, I was wondering what would be the most efficient way to do this reverse lookup?
A reverse dictionary lookup will return a list containing all the keys in a dictionary. Dictionary keys map values and are used to access values in dictionaries. dictionary = {'a': 1, 'b': 2, 'c': 3} lookup_val = 1 all_keys = [] for key, value in dictionary. items(): if(value == lookup_val): all_keys.
Instead of using a for loop, we can reverse a dictionary in a single python statement using dictionary comprehension. Here, we will create the output dictionary by reversing the key and value in each key-value pair of the dictionary as follows.
1. Using foreach loop. The idea is to create a new instance of Dictionary<TValue,TKey> for a given dictionary of type Dictionary<TKey,TValue> . Then use a foreach loop to iterate over the dictionary, and insert each mapping into the new Dictionary in reverse order of its key-value pair.
Basically, You can use LINQ
and get the Key
like this, without reversing anything:
var key = dictionary.FirstOrDefault(x => x.Value == "ab").Key;
If you really want to reverse your Dictionary, you can use an extension method like this:
public static Dictionary<TValue, TKey> Reverse<TKey, TValue>(this IDictionary<TKey, TValue> source) { var dictionary = new Dictionary<TValue, TKey>(); foreach (var entry in source) { if(!dictionary.ContainsKey(entry.Value)) dictionary.Add(entry.Value, entry.Key); } return dictionary; }
Then you can use it like this:
var reversedDictionary = dictionary.Reverse(); var key = reversedDictionary["ab"];
Note: if you have duplicate values then this method will add the first Value
and ignore the others.
Use the Linq ToDictionary
function:
var reversed = d.ToDictionary(x => x.Value, x => x.Key);
You can see below that it works, as tested in Linqpad:
var d = new Dictionary<int, string>(); d.Add(1,"one"); d.Add(2,"two"); d.Dump(); //prints it out in linq-pad var reversed = d.ToDictionary(x => x.Value, x => x.Key); reversed.Dump(); //prints it out in linq-pad
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With