Python reverse / invert a mapping
Given a dictionary like so:
my_map = { 'a': 1, 'b':2 }
How can one invert this map to get:
inv_map = { 1: 'a', 2: 'b' }
EDITOR NOTE: map
changed to my_map
to avoid conflicts with the built-in function, map
. Some comments may be affected below.
python dictionary mapping inverse
add a comment |
Given a dictionary like so:
my_map = { 'a': 1, 'b':2 }
How can one invert this map to get:
inv_map = { 1: 'a', 2: 'b' }
EDITOR NOTE: map
changed to my_map
to avoid conflicts with the built-in function, map
. Some comments may be affected below.
python dictionary mapping inverse
dict(zip(inv_map.values(), inv_map.keys()))
– Seshadri VS
Sep 22 '18 at 10:33
@SeshadriVS, it works (for both Python 2 and Python 3, thanks! =)
– Filipp W.
Nov 7 '18 at 9:06
add a comment |
Given a dictionary like so:
my_map = { 'a': 1, 'b':2 }
How can one invert this map to get:
inv_map = { 1: 'a', 2: 'b' }
EDITOR NOTE: map
changed to my_map
to avoid conflicts with the built-in function, map
. Some comments may be affected below.
python dictionary mapping inverse
Given a dictionary like so:
my_map = { 'a': 1, 'b':2 }
How can one invert this map to get:
inv_map = { 1: 'a', 2: 'b' }
EDITOR NOTE: map
changed to my_map
to avoid conflicts with the built-in function, map
. Some comments may be affected below.
python dictionary mapping inverse
python dictionary mapping inverse
edited Apr 24 '18 at 14:00
Brian M. Hunt
asked Jan 27 '09 at 14:46
Brian M. HuntBrian M. Hunt
36.5k56177295
36.5k56177295
dict(zip(inv_map.values(), inv_map.keys()))
– Seshadri VS
Sep 22 '18 at 10:33
@SeshadriVS, it works (for both Python 2 and Python 3, thanks! =)
– Filipp W.
Nov 7 '18 at 9:06
add a comment |
dict(zip(inv_map.values(), inv_map.keys()))
– Seshadri VS
Sep 22 '18 at 10:33
@SeshadriVS, it works (for both Python 2 and Python 3, thanks! =)
– Filipp W.
Nov 7 '18 at 9:06
dict(zip(inv_map.values(), inv_map.keys()))
– Seshadri VS
Sep 22 '18 at 10:33
dict(zip(inv_map.values(), inv_map.keys()))
– Seshadri VS
Sep 22 '18 at 10:33
@SeshadriVS, it works (for both Python 2 and Python 3, thanks! =)
– Filipp W.
Nov 7 '18 at 9:06
@SeshadriVS, it works (for both Python 2 and Python 3, thanks! =)
– Filipp W.
Nov 7 '18 at 9:06
add a comment |
31 Answers
31
active
oldest
votes
1 2
next
For Python 2.7.x
inv_map = {v: k for k, v in my_map.iteritems()}
For Python 3+:
inv_map = {v: k for k, v in my_map.items()}
44
in python2.7+, using map.iteritems() would be more efficient.
– Mike Fogel
Dec 4 '12 at 23:40
6
however in python 3+ just usemy_map.items()
as the answer shows.
– Rick Teachey
Aug 21 '16 at 13:03
10
@rasen58 Python dictionaries don't have an ordering
– Anentropic
Oct 27 '16 at 12:42
4
This'll work except that it won't work if there is not unicity in the values. In that case you'll loose some entries
– gabuzo
Oct 23 '17 at 16:28
5
Fun Fact: Dictionaries will be ordered (by time of insertion) in Python 3.7 onwards.
– byxor
Jun 12 '18 at 20:18
|
show 6 more comments
Assuming that the values in the dict are unique:
dict((v, k) for k, v in my_map.iteritems())
17
What if the values aren't unique?
– Buttons840
Apr 27 '12 at 20:34
14
The values have to be hashable too
– John La Rooy
May 24 '12 at 1:52
25
@Buttons840: If the values aren’t unique, there is no unique inversion of the dictionary anyway or, with other words, inverting does not make sense.
– Wrzlprmft
Oct 25 '14 at 14:13
2
@Buttons840 Only the last key will appear for the value. There are probably no guarantees on the order thatiteritems()
will output, so it may be assumed that an arbitrary key will be assigned for a non-unique value, in a way that will be apparently reproducible under some conditions, but no so in general.
– Evgeni Sergeev
Apr 21 '15 at 8:13
3
@Wrzlprmft There is a natural definition for inverse in the case of non unique values. Every value is mapped to the set of keys leading to it.
– Leo
Oct 25 '16 at 19:08
|
show 1 more comment
If the values in my_map
aren't unique:
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, )
inv_map[v].append(k)
49
... or just inv_map.setdefault(v, ).append(k). I used to be a defaultdict fanboy, but then I got screwed one too many times and concluded that actually explicit is better than implicit.
– alsuren
Nov 10 '10 at 14:55
This answer is incorrect for multi-map, append here is useless because the value is reset to empty list each time, should use set_default
– Yaroslav Bulatov
Apr 22 '16 at 20:37
1
@YaroslavBulatov no, the code as shown here isn't broken -inv_map.get(v, )
returns the already-added list if there is one, so the assignment doesn't reset to an empty list.setdefault
would still be prettier, though.
– Mark Amery
Jul 16 '16 at 17:23
8
A set would make more sense here. The keys are (probably) hashable, and there is no order.inv_map.setdefault(v, set()).add(k)
.
– Artyer
Aug 11 '17 at 17:17
add a comment |
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
11
Upvoted for retaining the type rather than silently converting into dict
– gerrit
Nov 26 '14 at 17:25
2
@gerrit: Too bad this motivation is not explained in the answer itself. (Moreover, the answer has to explaination at all at the moment.)
– vog
Jan 15 '17 at 21:42
1
This... is extremely clever. While non-human-readable, this one-liner successfully preserves both the type and ordering (e.g., forOrderedDict
types) of the original dictionary by passing an anonymous iterable to thedict(iterable)
form of mapping constructors. Explanatory exposition would have been helpful, of course.</sigh>
– Cecil Curry
Dec 22 '17 at 6:37
1
Clever it may be, but it doesn't work when more than one key has the same value in the original dictionary.
– Rafael_Espericueta
Jun 5 '18 at 1:02
add a comment |
Try this:
inv_map = dict(zip(my_map.values(), my_map.keys()))
(Note that the Python docs on dictionary views explicitly guarantee that .keys()
and .values()
have their elements in the same order, which allows the approach above to work.)
Alternatively:
inv_map = dict((my_map[k], k) for k in my_map)
or using python 3.0's dict comprehensions
inv_map = {my_map[k] : k for k in my_map}
Notice that this only works if the keys are unique (which is almost never the case if you want to invert them).
– gented
Jun 22 '18 at 8:26
According to python.org/dev/peps/pep-0274 dict comprehensions are available in 2.7+, too.
– Kawu
Oct 27 '18 at 1:03
add a comment |
Another, more functional, way:
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
2
Thanks for posting. I am not sure this is preferable - to quote Guido Van Rossum in PEP 279: "filter
andmap
should die and be subsumed into list comprehensions, not grow more variants".
– Brian M. Hunt
Feb 26 '14 at 16:38
1
Yeah, that's a fair point Brian. I was just adding it as a point of conversation. The dict comprehension way is more readable for most I'd imagine. (And likely faster too I'd guess)
– Brendan Maguire
Feb 26 '14 at 17:10
2
In Python 3 it should bemy_map.items()
.
– dmvianna
Jul 25 '16 at 23:47
1
Might be less readable than others, but this way does have the benefit of being able to swap outdict
with other mapping types such ascollections.OrderedDict
orcollections.defaultdict
– Will S
Aug 17 '17 at 9:51
add a comment |
This expands upon the answer Python reverse / invert a mapping, applying to when the values in the dict aren't unique.
class ReversibleDict(dict):
def reversed(self):
"""
Return a reversed dict, with common values in the original dict
grouped into a list in the returned dict.
Example:
>>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
>>> d.reversed()
{1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
"""
revdict = {}
for k, v in self.iteritems():
revdict.setdefault(v, ).append(k)
return revdict
The implementation is limited in that you cannot use reversed
twice and get the original back. It is not symmetric as such. It is tested with Python 2.6. Here is a use case of how I am using to print the resultant dict.
If you'd rather use a set
than a list
, and there are applications for which this makes sense, instead of setdefault(v, ).append(k)
, use setdefault(v, set()).add(k)
.
this would also be a good place to use sets instead of lists, i.e.revdict.setdefault(v, set()).add(k)
– mueslo
Dec 22 '16 at 20:42
Of course, but that's exacty why it's a good reason to useset
. It's the intrinsic type that applies here. What if I want to find all keys where the values are not1
or2
? Then I can just dod.keys() - inv_d[1] - inv_d[2]
(in Python 3)
– mueslo
Dec 22 '16 at 20:57
add a comment |
Combination of list and dictionary comprehension. Can handle duplicate keys
{v:[i for i in d.keys() if d[i] == v ] for k,v in d.items()}
add a comment |
Adding my 2 cents of pythonic way:
inv_map = dict(map(reversed, my_map.items()))
Example:
In [7]: my_map
Out[7]: {1: 'one', 2: 'two', 3: 'three'}
In [8]: inv_map = dict(map(reversed, my_map.items()))
In [9]: inv_map
Out[9]: {'one': 1, 'three': 3, 'two': 2}
This is a clone of Brendan Maguire's answer which has been given three years before.
– Adrian W
Sep 20 '18 at 10:01
add a comment |
If the values aren't unique, and you're a little hardcore:
inv_map = dict(
(v, [k for (k, xx) in filter(lambda (key, value): value == v, my_map.items())])
for v in set(my_map.values())
)
Especially for a large dict, note that this solution is far less efficient than the answer Python reverse / invert a mapping because it loops over items()
multiple times.
5
This is just plain unreadable and a good example of how to not write maintainable code. I won't-1
because it still answers the question, just my opinion.
– Russ Bradberry
Oct 3 '12 at 19:19
add a comment |
We may also reverse a dictionary with duplicate keys using defaultdict
:
from collections import Counter, defaultdict
def invert_dict(d):
d_inv = defaultdict(list)
for k, v in c.items():
d_inv[v].append(k)
return d_inv
text = 'aaa bbb ccc ddd aaa bbb ccc aaa'
c = Counter(text.split()) # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
dict(invert_dict(c)) # {1: ['ddd'], 2: ['bbb', 'ccc'], 3: ['aaa']}
See here:
This technique is simpler and faster than an equivalent technique using
dict.setdefault()
.
add a comment |
In addition to the other functions suggested above, if you like lambdas:
invert = lambda mydict: {v:k for k, v in mydict.items()}
Or, you could do it this way too:
invert = lambda mydict: dict( zip(mydict.values(), mydict.keys()) )
-1; all you've done is taken other answers from the page and put them into a lambda. Also, assigning a lambda to a variable is a PEP 8 violation.
– Mark Amery
Jul 16 '16 at 18:03
add a comment |
This handles non-unique values and retains much of the look of the unique case.
inv_map = {v:[k for k in my_map if my_map[k] == v] for v in my_map.itervalues()}
For Python 3.x, replace itervalues with values.
I can't take credit for this... it was suggested by Icon Jack.
This solution is quite elegant as a one liner and it manages the non unique values case. However it has a complexity in O(n2) which means it should be ok for several dozens of elements but it would be too slow for practical use if you have several hundreds of thousands of elements in your initial dictionary. The solutions based on a default dict are way faster than this one.
– gabuzo
Oct 24 '17 at 8:21
Gabuzo is quite right. This version is (arguably) clearer than some, but it is not suitable for large data.
– Ersatz Kwisatz
Oct 25 '17 at 17:01
add a comment |
I think the best way to do this is to define a class. Here is an implementation of a "symmetric dictionary":
class SymDict:
def __init__(self):
self.aToB = {}
self.bToA = {}
def assocAB(self, a, b):
# Stores and returns a tuple (a,b) of overwritten bindings
currB = None
if a in self.aToB: currB = self.bToA[a]
currA = None
if b in self.bToA: currA = self.aToB[b]
self.aToB[a] = b
self.bToA[b] = a
return (currA, currB)
def lookupA(self, a):
if a in self.aToB:
return self.aToB[a]
return None
def lookupB(self, b):
if b in self.bToA:
return self.bToA[b]
return None
Deletion and iteration methods are easy enough to implement if they're needed.
This implementation is way more efficient than inverting an entire dictionary (which seems to be the most popular solution on this page). Not to mention, you can add or remove values from your SymDict as much as you want, and your inverse-dictionary will always stay valid -- this isn't true if you simply reverse the entire dictionary once.
I like this idea, though it would be good to note that it trades off additional memory to achieve improved computation. A happier medium may be caching or lazily computing the mirror. It is also worth noting that it could be made more syntactically appealing with e.g. dictionary views and custom operators.
– Brian M. Hunt
Sep 28 '14 at 10:59
@BrianM.Hunt It trades off memory, but not a lot. You only store two sets of pointers to each object. If your objects are much bigger than single integers, this won't make much of a difference. If you have huge table of tiny objects on the other hand, you might need to consider those suggestions...
– NcAdams
Sep 28 '14 at 20:46
And I agree, there's more to be done here -- I might flesh this out into a fully functioning datatype later
– NcAdams
Sep 28 '14 at 20:47
1
"This implementation is way more efficient than inverting an entire dictionary" - um, why? I don't see any plausible way this approach can have a significant performance benefit; you've still got two dictionaries this way. If anything, I'd expect this to be slower than, say, inverting the dict with a comprehension, because if you invert the dict Python can plausibly know in advance how many buckets to allocate in the underlying C data structure and create the inverse map without ever callingdictresize
, but this approach denies Python that possibility.
– Mark Amery
Jul 16 '16 at 18:11
add a comment |
Using zip
inv_map = dict(zip(my_map.values(), my_map.keys()))
add a comment |
Try this for python 2.7/3.x
inv_map={};
for i in my_map:
inv_map[my_map[i]]=i
print inv_map
add a comment |
I would do it that way in python 2.
inv_map = {my_map[x] : x for x in my_map}
add a comment |
def invertDictionary(d):
myDict = {}
for i in d:
value = d.get(i)
myDict.setdefault(value,).append(i)
return myDict
print invertDictionary({'a':1, 'b':2, 'c':3 , 'd' : 1})
This will provide output as : {1: ['a', 'd'], 2: ['b'], 3: ['c']}
add a comment |
def reverse_dictionary(input_dict):
out = {}
for v in input_dict.values():
for value in v:
if value not in out:
out[value.lower()] =
for i in input_dict:
for j in out:
if j in map (lambda x : x.lower(),input_dict[i]):
out[j].append(i.lower())
out[j].sort()
return out
this code do like this:
r = reverse_dictionary({'Accurate': ['exact', 'precise'], 'exact': ['precise'], 'astute': ['Smart', 'clever'], 'smart': ['clever', 'bright', 'talented']})
print(r)
{'precise': ['accurate', 'exact'], 'clever': ['astute', 'smart'], 'talented': ['smart'], 'bright': ['smart'], 'exact': ['accurate'], 'smart': ['astute']}
Generally, answers are much more helpful if they include an explanation of what the code is intended to do, and why that solves the problem without introducing others.
– Tom Aranda
Dec 18 '17 at 16:17
It is a nice solution
– Dr Beco
Jul 14 '18 at 16:06
It's very nice, but a lot of unexplained decisions (for example, why lower case for keys?)
– Liudvikas Akelis
Sep 7 '18 at 12:49
add a comment |
Function is symmetric for values of type list; Tuples are coverted to lists when performing reverse_dict(reverse_dict(dictionary))
def reverse_dict(dictionary):
reverse_dict = {}
for key, value in dictionary.iteritems():
if not isinstance(value, (list, tuple)):
value = [value]
for val in value:
reverse_dict[val] = reverse_dict.get(val, )
reverse_dict[val].append(key)
for key, value in reverse_dict.iteritems():
if len(value) == 1:
reverse_dict[key] = value[0]
return reverse_dict
add a comment |
Since dictionaries require one unique key within the dictionary unlike values, we have to append the reversed values into a list of sort to be included within the new specific keys.
def r_maping(dictionary):
List_z=
Map= {}
for z, x in dictionary.iteritems(): #iterate through the keys and values
Map.setdefault(x,List_z).append(z) #Setdefault is the same as dict[key]=default."The method returns the key value available in the dictionary and if given key is not available then it will return provided default value. Afterward, we will append into the default list our new values for the specific key.
return Map
add a comment |
Not something completely different, just a bit rewritten recipe from Cookbook. It's futhermore optimized by retaining setdefault
method, instead of each time getting it through the instance:
def inverse(mapping):
'''
A function to inverse mapping, collecting keys with simillar values
in list. Careful to retain original type and to be fast.
>> d = dict(a=1, b=2, c=1, d=3, e=2, f=1, g=5, h=2)
>> inverse(d)
{1: ['f', 'c', 'a'], 2: ['h', 'b', 'e'], 3: ['d'], 5: ['g']}
'''
res = {}
setdef = res.setdefault
for key, value in mapping.items():
setdef(value, ).append(key)
return res if mapping.__class__==dict else mapping.__class__(res)
Designed to be run under CPython 3.x, for 2.x replace mapping.items()
with mapping.iteritems()
On my machine runs a bit faster, than other examples here
add a comment |
If values aren't unique AND may be a hash (one dimension):
for k, v in myDict.items():
if len(v) > 1:
for item in v:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
And with a recursion if you need to dig deeper then just one dimension:
def digList(lst):
temp =
for item in lst:
if type(item) is list:
temp.append(digList(item))
else:
temp.append(item)
return set(temp)
for k, v in myDict.items():
if type(v) is list:
items = digList(v)
for item in items:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
You might improve your solutions using a defaultdict: it'll remove all the invDict[item] = invDict.get(item, ) lines
– gabuzo
Oct 24 '17 at 8:22
add a comment |
Inverse your dictionary:
dict_ = {"k0":"v0", "k1":"v1", "k2":"v1"}
inversed_dict_ = {val: key for key, val in dict_.items()}
print(inversed_dict_["v1"])
add a comment |
As per my comment to the question. I think the easiest and one liner which works for both Python2 and Python 3 will be
dict(zip(inv_map.values(), inv_map.keys()))
add a comment |
For instance, you have the following dictionary:
dict = {'a': 'fire', 'b': 'ice', 'c': 'fire', 'd': 'water'}
And you wanna get it in such an inverted form:
inverted_dict = {'fire': ['a', 'c'], 'ice': ['b'], 'water': ['d']}
First Solution. For inverting key-value pairs in your dictionary use a for
-loop approach:
# Use this code to invert dictionaries that have non-unique values
inverted_dict = dictio()
for key, value in dict.items():
inverted_dict.setdefault(value, list()).append(key)
Second Solution. Use a dictionary comprehension approach for inversion:
# Use this code to invert dictionaries that have unique values
inverted_dict = {value: key for key, value in dict.items()}
Third Solution. Use reverting the inversion approach:
# Use this code to invert dictionaries that have lists of values
dict = {value: key for key in inverted_dict for value in my_map[key]}
add a comment |
Fast functional solution for non-bijective maps (values not unique):
from itertools import imap, groupby
def fst(s):
return s[0]
def snd(s):
return s[1]
def inverseDict(d):
"""
input d: a -> b
output : b -> set(a)
"""
return {
v : set(imap(fst, kv_iter))
for (v, kv_iter) in groupby(
sorted(d.iteritems(),
key=snd),
key=snd
)
}
In theory this should be faster than adding to the set (or appending to the list) one by one like in the imperative solution.
Unfortunately the values have to be sortable, the sorting is required by groupby.
"In theory this should be faster than adding to the set (or appending to the list) one by one" - no. Givenn
elements in the original dict, your approach hasO(n log n)
time complexity due to the need to sort the dict's items, whereas the naive imperative approach hasO(n)
time complexity. For all I know your approach may be faster up until absurdly largedict
s in practice, but it certainly isn't faster in theory.
– Mark Amery
Jul 16 '16 at 18:17
add a comment |
I wrote this with the help of cycle 'for' and method '.get()' and I changed the name 'map' of the dictionary to 'map1' because 'map' is a function.
def dict_invert(map1):
inv_map = {} # new dictionary
for key in map1.keys():
inv_map[map1.get(key)] = key
return inv_map
add a comment |
For all kinds of dictionary, no matter if they don't have unique values to use as keys, you can create a list of keys for each value
inv_map = {v: inv_map.get(v, ) + [k] for k,v in my_map.items()}
have you tested it for non-unique values? e.g.map = { 'a': 1, 'b':2, 'c':1 }
gives{1: ['c'], 2: ['b']}
forinv_map
,'a'
gets lost (I putinv_map = {}
before your line)
– Matthias 009
May 1 '12 at 16:36
1
This doesn't work, because the new value ofinv_map
is not assigned until the comprehension completes
– Eric
Jul 30 '14 at 15:11
add a comment |
This is not the best solution, but it works. Let's say the dictionary we want to reverse is:
dictionary = {'a': 1, 'b': 2, 'c': 3}, then:
dictionary = {'a': 1, 'b': 2, 'c': 3}
reverse_dictionary = {}
for index, val in enumerate(list(dictionary.values())):
reverse_dictionary[val] = list(dictionary.keys())[index]
The output of reverse_dictionary, should be {1: 'a', 2: 'b', 3: 'c'}
add a comment |
1 2
next
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: false,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f483666%2fpython-reverse-invert-a-mapping%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
StackExchange.ready(function () {
$("#show-editor-button input, #show-editor-button button").click(function () {
var showEditor = function() {
$("#show-editor-button").hide();
$("#post-form").removeClass("dno");
StackExchange.editor.finallyInit();
};
var useFancy = $(this).data('confirm-use-fancy');
if(useFancy == 'True') {
var popupTitle = $(this).data('confirm-fancy-title');
var popupBody = $(this).data('confirm-fancy-body');
var popupAccept = $(this).data('confirm-fancy-accept-button');
$(this).loadPopup({
url: '/post/self-answer-popup',
loaded: function(popup) {
var pTitle = $(popup).find('h2');
var pBody = $(popup).find('.popup-body');
var pSubmit = $(popup).find('.popup-submit');
pTitle.text(popupTitle);
pBody.html(popupBody);
pSubmit.val(popupAccept).click(showEditor);
}
})
} else{
var confirmText = $(this).data('confirm-text');
if (confirmText ? confirm(confirmText) : true) {
showEditor();
}
}
});
});
31 Answers
31
active
oldest
votes
31 Answers
31
active
oldest
votes
active
oldest
votes
active
oldest
votes
1 2
next
For Python 2.7.x
inv_map = {v: k for k, v in my_map.iteritems()}
For Python 3+:
inv_map = {v: k for k, v in my_map.items()}
44
in python2.7+, using map.iteritems() would be more efficient.
– Mike Fogel
Dec 4 '12 at 23:40
6
however in python 3+ just usemy_map.items()
as the answer shows.
– Rick Teachey
Aug 21 '16 at 13:03
10
@rasen58 Python dictionaries don't have an ordering
– Anentropic
Oct 27 '16 at 12:42
4
This'll work except that it won't work if there is not unicity in the values. In that case you'll loose some entries
– gabuzo
Oct 23 '17 at 16:28
5
Fun Fact: Dictionaries will be ordered (by time of insertion) in Python 3.7 onwards.
– byxor
Jun 12 '18 at 20:18
|
show 6 more comments
For Python 2.7.x
inv_map = {v: k for k, v in my_map.iteritems()}
For Python 3+:
inv_map = {v: k for k, v in my_map.items()}
44
in python2.7+, using map.iteritems() would be more efficient.
– Mike Fogel
Dec 4 '12 at 23:40
6
however in python 3+ just usemy_map.items()
as the answer shows.
– Rick Teachey
Aug 21 '16 at 13:03
10
@rasen58 Python dictionaries don't have an ordering
– Anentropic
Oct 27 '16 at 12:42
4
This'll work except that it won't work if there is not unicity in the values. In that case you'll loose some entries
– gabuzo
Oct 23 '17 at 16:28
5
Fun Fact: Dictionaries will be ordered (by time of insertion) in Python 3.7 onwards.
– byxor
Jun 12 '18 at 20:18
|
show 6 more comments
For Python 2.7.x
inv_map = {v: k for k, v in my_map.iteritems()}
For Python 3+:
inv_map = {v: k for k, v in my_map.items()}
For Python 2.7.x
inv_map = {v: k for k, v in my_map.iteritems()}
For Python 3+:
inv_map = {v: k for k, v in my_map.items()}
edited Oct 14 '16 at 16:21
Dave Lasley
4,64212633
4,64212633
answered Jan 27 '09 at 15:24
SilentGhostSilentGhost
194k47266263
194k47266263
44
in python2.7+, using map.iteritems() would be more efficient.
– Mike Fogel
Dec 4 '12 at 23:40
6
however in python 3+ just usemy_map.items()
as the answer shows.
– Rick Teachey
Aug 21 '16 at 13:03
10
@rasen58 Python dictionaries don't have an ordering
– Anentropic
Oct 27 '16 at 12:42
4
This'll work except that it won't work if there is not unicity in the values. In that case you'll loose some entries
– gabuzo
Oct 23 '17 at 16:28
5
Fun Fact: Dictionaries will be ordered (by time of insertion) in Python 3.7 onwards.
– byxor
Jun 12 '18 at 20:18
|
show 6 more comments
44
in python2.7+, using map.iteritems() would be more efficient.
– Mike Fogel
Dec 4 '12 at 23:40
6
however in python 3+ just usemy_map.items()
as the answer shows.
– Rick Teachey
Aug 21 '16 at 13:03
10
@rasen58 Python dictionaries don't have an ordering
– Anentropic
Oct 27 '16 at 12:42
4
This'll work except that it won't work if there is not unicity in the values. In that case you'll loose some entries
– gabuzo
Oct 23 '17 at 16:28
5
Fun Fact: Dictionaries will be ordered (by time of insertion) in Python 3.7 onwards.
– byxor
Jun 12 '18 at 20:18
44
44
in python2.7+, using map.iteritems() would be more efficient.
– Mike Fogel
Dec 4 '12 at 23:40
in python2.7+, using map.iteritems() would be more efficient.
– Mike Fogel
Dec 4 '12 at 23:40
6
6
however in python 3+ just use
my_map.items()
as the answer shows.– Rick Teachey
Aug 21 '16 at 13:03
however in python 3+ just use
my_map.items()
as the answer shows.– Rick Teachey
Aug 21 '16 at 13:03
10
10
@rasen58 Python dictionaries don't have an ordering
– Anentropic
Oct 27 '16 at 12:42
@rasen58 Python dictionaries don't have an ordering
– Anentropic
Oct 27 '16 at 12:42
4
4
This'll work except that it won't work if there is not unicity in the values. In that case you'll loose some entries
– gabuzo
Oct 23 '17 at 16:28
This'll work except that it won't work if there is not unicity in the values. In that case you'll loose some entries
– gabuzo
Oct 23 '17 at 16:28
5
5
Fun Fact: Dictionaries will be ordered (by time of insertion) in Python 3.7 onwards.
– byxor
Jun 12 '18 at 20:18
Fun Fact: Dictionaries will be ordered (by time of insertion) in Python 3.7 onwards.
– byxor
Jun 12 '18 at 20:18
|
show 6 more comments
Assuming that the values in the dict are unique:
dict((v, k) for k, v in my_map.iteritems())
17
What if the values aren't unique?
– Buttons840
Apr 27 '12 at 20:34
14
The values have to be hashable too
– John La Rooy
May 24 '12 at 1:52
25
@Buttons840: If the values aren’t unique, there is no unique inversion of the dictionary anyway or, with other words, inverting does not make sense.
– Wrzlprmft
Oct 25 '14 at 14:13
2
@Buttons840 Only the last key will appear for the value. There are probably no guarantees on the order thatiteritems()
will output, so it may be assumed that an arbitrary key will be assigned for a non-unique value, in a way that will be apparently reproducible under some conditions, but no so in general.
– Evgeni Sergeev
Apr 21 '15 at 8:13
3
@Wrzlprmft There is a natural definition for inverse in the case of non unique values. Every value is mapped to the set of keys leading to it.
– Leo
Oct 25 '16 at 19:08
|
show 1 more comment
Assuming that the values in the dict are unique:
dict((v, k) for k, v in my_map.iteritems())
17
What if the values aren't unique?
– Buttons840
Apr 27 '12 at 20:34
14
The values have to be hashable too
– John La Rooy
May 24 '12 at 1:52
25
@Buttons840: If the values aren’t unique, there is no unique inversion of the dictionary anyway or, with other words, inverting does not make sense.
– Wrzlprmft
Oct 25 '14 at 14:13
2
@Buttons840 Only the last key will appear for the value. There are probably no guarantees on the order thatiteritems()
will output, so it may be assumed that an arbitrary key will be assigned for a non-unique value, in a way that will be apparently reproducible under some conditions, but no so in general.
– Evgeni Sergeev
Apr 21 '15 at 8:13
3
@Wrzlprmft There is a natural definition for inverse in the case of non unique values. Every value is mapped to the set of keys leading to it.
– Leo
Oct 25 '16 at 19:08
|
show 1 more comment
Assuming that the values in the dict are unique:
dict((v, k) for k, v in my_map.iteritems())
Assuming that the values in the dict are unique:
dict((v, k) for k, v in my_map.iteritems())
edited Aug 21 '16 at 12:51
Rick Teachey
15.6k73965
15.6k73965
answered Jan 27 '09 at 14:50
unbeknown
17
What if the values aren't unique?
– Buttons840
Apr 27 '12 at 20:34
14
The values have to be hashable too
– John La Rooy
May 24 '12 at 1:52
25
@Buttons840: If the values aren’t unique, there is no unique inversion of the dictionary anyway or, with other words, inverting does not make sense.
– Wrzlprmft
Oct 25 '14 at 14:13
2
@Buttons840 Only the last key will appear for the value. There are probably no guarantees on the order thatiteritems()
will output, so it may be assumed that an arbitrary key will be assigned for a non-unique value, in a way that will be apparently reproducible under some conditions, but no so in general.
– Evgeni Sergeev
Apr 21 '15 at 8:13
3
@Wrzlprmft There is a natural definition for inverse in the case of non unique values. Every value is mapped to the set of keys leading to it.
– Leo
Oct 25 '16 at 19:08
|
show 1 more comment
17
What if the values aren't unique?
– Buttons840
Apr 27 '12 at 20:34
14
The values have to be hashable too
– John La Rooy
May 24 '12 at 1:52
25
@Buttons840: If the values aren’t unique, there is no unique inversion of the dictionary anyway or, with other words, inverting does not make sense.
– Wrzlprmft
Oct 25 '14 at 14:13
2
@Buttons840 Only the last key will appear for the value. There are probably no guarantees on the order thatiteritems()
will output, so it may be assumed that an arbitrary key will be assigned for a non-unique value, in a way that will be apparently reproducible under some conditions, but no so in general.
– Evgeni Sergeev
Apr 21 '15 at 8:13
3
@Wrzlprmft There is a natural definition for inverse in the case of non unique values. Every value is mapped to the set of keys leading to it.
– Leo
Oct 25 '16 at 19:08
17
17
What if the values aren't unique?
– Buttons840
Apr 27 '12 at 20:34
What if the values aren't unique?
– Buttons840
Apr 27 '12 at 20:34
14
14
The values have to be hashable too
– John La Rooy
May 24 '12 at 1:52
The values have to be hashable too
– John La Rooy
May 24 '12 at 1:52
25
25
@Buttons840: If the values aren’t unique, there is no unique inversion of the dictionary anyway or, with other words, inverting does not make sense.
– Wrzlprmft
Oct 25 '14 at 14:13
@Buttons840: If the values aren’t unique, there is no unique inversion of the dictionary anyway or, with other words, inverting does not make sense.
– Wrzlprmft
Oct 25 '14 at 14:13
2
2
@Buttons840 Only the last key will appear for the value. There are probably no guarantees on the order that
iteritems()
will output, so it may be assumed that an arbitrary key will be assigned for a non-unique value, in a way that will be apparently reproducible under some conditions, but no so in general.– Evgeni Sergeev
Apr 21 '15 at 8:13
@Buttons840 Only the last key will appear for the value. There are probably no guarantees on the order that
iteritems()
will output, so it may be assumed that an arbitrary key will be assigned for a non-unique value, in a way that will be apparently reproducible under some conditions, but no so in general.– Evgeni Sergeev
Apr 21 '15 at 8:13
3
3
@Wrzlprmft There is a natural definition for inverse in the case of non unique values. Every value is mapped to the set of keys leading to it.
– Leo
Oct 25 '16 at 19:08
@Wrzlprmft There is a natural definition for inverse in the case of non unique values. Every value is mapped to the set of keys leading to it.
– Leo
Oct 25 '16 at 19:08
|
show 1 more comment
If the values in my_map
aren't unique:
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, )
inv_map[v].append(k)
49
... or just inv_map.setdefault(v, ).append(k). I used to be a defaultdict fanboy, but then I got screwed one too many times and concluded that actually explicit is better than implicit.
– alsuren
Nov 10 '10 at 14:55
This answer is incorrect for multi-map, append here is useless because the value is reset to empty list each time, should use set_default
– Yaroslav Bulatov
Apr 22 '16 at 20:37
1
@YaroslavBulatov no, the code as shown here isn't broken -inv_map.get(v, )
returns the already-added list if there is one, so the assignment doesn't reset to an empty list.setdefault
would still be prettier, though.
– Mark Amery
Jul 16 '16 at 17:23
8
A set would make more sense here. The keys are (probably) hashable, and there is no order.inv_map.setdefault(v, set()).add(k)
.
– Artyer
Aug 11 '17 at 17:17
add a comment |
If the values in my_map
aren't unique:
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, )
inv_map[v].append(k)
49
... or just inv_map.setdefault(v, ).append(k). I used to be a defaultdict fanboy, but then I got screwed one too many times and concluded that actually explicit is better than implicit.
– alsuren
Nov 10 '10 at 14:55
This answer is incorrect for multi-map, append here is useless because the value is reset to empty list each time, should use set_default
– Yaroslav Bulatov
Apr 22 '16 at 20:37
1
@YaroslavBulatov no, the code as shown here isn't broken -inv_map.get(v, )
returns the already-added list if there is one, so the assignment doesn't reset to an empty list.setdefault
would still be prettier, though.
– Mark Amery
Jul 16 '16 at 17:23
8
A set would make more sense here. The keys are (probably) hashable, and there is no order.inv_map.setdefault(v, set()).add(k)
.
– Artyer
Aug 11 '17 at 17:17
add a comment |
If the values in my_map
aren't unique:
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, )
inv_map[v].append(k)
If the values in my_map
aren't unique:
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, )
inv_map[v].append(k)
edited Aug 21 '16 at 12:52
Rick Teachey
15.6k73965
15.6k73965
answered Jan 27 '09 at 21:33
Robert RossneyRobert Rossney
72.1k23121199
72.1k23121199
49
... or just inv_map.setdefault(v, ).append(k). I used to be a defaultdict fanboy, but then I got screwed one too many times and concluded that actually explicit is better than implicit.
– alsuren
Nov 10 '10 at 14:55
This answer is incorrect for multi-map, append here is useless because the value is reset to empty list each time, should use set_default
– Yaroslav Bulatov
Apr 22 '16 at 20:37
1
@YaroslavBulatov no, the code as shown here isn't broken -inv_map.get(v, )
returns the already-added list if there is one, so the assignment doesn't reset to an empty list.setdefault
would still be prettier, though.
– Mark Amery
Jul 16 '16 at 17:23
8
A set would make more sense here. The keys are (probably) hashable, and there is no order.inv_map.setdefault(v, set()).add(k)
.
– Artyer
Aug 11 '17 at 17:17
add a comment |
49
... or just inv_map.setdefault(v, ).append(k). I used to be a defaultdict fanboy, but then I got screwed one too many times and concluded that actually explicit is better than implicit.
– alsuren
Nov 10 '10 at 14:55
This answer is incorrect for multi-map, append here is useless because the value is reset to empty list each time, should use set_default
– Yaroslav Bulatov
Apr 22 '16 at 20:37
1
@YaroslavBulatov no, the code as shown here isn't broken -inv_map.get(v, )
returns the already-added list if there is one, so the assignment doesn't reset to an empty list.setdefault
would still be prettier, though.
– Mark Amery
Jul 16 '16 at 17:23
8
A set would make more sense here. The keys are (probably) hashable, and there is no order.inv_map.setdefault(v, set()).add(k)
.
– Artyer
Aug 11 '17 at 17:17
49
49
... or just inv_map.setdefault(v, ).append(k). I used to be a defaultdict fanboy, but then I got screwed one too many times and concluded that actually explicit is better than implicit.
– alsuren
Nov 10 '10 at 14:55
... or just inv_map.setdefault(v, ).append(k). I used to be a defaultdict fanboy, but then I got screwed one too many times and concluded that actually explicit is better than implicit.
– alsuren
Nov 10 '10 at 14:55
This answer is incorrect for multi-map, append here is useless because the value is reset to empty list each time, should use set_default
– Yaroslav Bulatov
Apr 22 '16 at 20:37
This answer is incorrect for multi-map, append here is useless because the value is reset to empty list each time, should use set_default
– Yaroslav Bulatov
Apr 22 '16 at 20:37
1
1
@YaroslavBulatov no, the code as shown here isn't broken -
inv_map.get(v, )
returns the already-added list if there is one, so the assignment doesn't reset to an empty list. setdefault
would still be prettier, though.– Mark Amery
Jul 16 '16 at 17:23
@YaroslavBulatov no, the code as shown here isn't broken -
inv_map.get(v, )
returns the already-added list if there is one, so the assignment doesn't reset to an empty list. setdefault
would still be prettier, though.– Mark Amery
Jul 16 '16 at 17:23
8
8
A set would make more sense here. The keys are (probably) hashable, and there is no order.
inv_map.setdefault(v, set()).add(k)
.– Artyer
Aug 11 '17 at 17:17
A set would make more sense here. The keys are (probably) hashable, and there is no order.
inv_map.setdefault(v, set()).add(k)
.– Artyer
Aug 11 '17 at 17:17
add a comment |
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
11
Upvoted for retaining the type rather than silently converting into dict
– gerrit
Nov 26 '14 at 17:25
2
@gerrit: Too bad this motivation is not explained in the answer itself. (Moreover, the answer has to explaination at all at the moment.)
– vog
Jan 15 '17 at 21:42
1
This... is extremely clever. While non-human-readable, this one-liner successfully preserves both the type and ordering (e.g., forOrderedDict
types) of the original dictionary by passing an anonymous iterable to thedict(iterable)
form of mapping constructors. Explanatory exposition would have been helpful, of course.</sigh>
– Cecil Curry
Dec 22 '17 at 6:37
1
Clever it may be, but it doesn't work when more than one key has the same value in the original dictionary.
– Rafael_Espericueta
Jun 5 '18 at 1:02
add a comment |
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
11
Upvoted for retaining the type rather than silently converting into dict
– gerrit
Nov 26 '14 at 17:25
2
@gerrit: Too bad this motivation is not explained in the answer itself. (Moreover, the answer has to explaination at all at the moment.)
– vog
Jan 15 '17 at 21:42
1
This... is extremely clever. While non-human-readable, this one-liner successfully preserves both the type and ordering (e.g., forOrderedDict
types) of the original dictionary by passing an anonymous iterable to thedict(iterable)
form of mapping constructors. Explanatory exposition would have been helpful, of course.</sigh>
– Cecil Curry
Dec 22 '17 at 6:37
1
Clever it may be, but it doesn't work when more than one key has the same value in the original dictionary.
– Rafael_Espericueta
Jun 5 '18 at 1:02
add a comment |
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
answered Nov 5 '09 at 10:41
fs.fs.
63858
63858
11
Upvoted for retaining the type rather than silently converting into dict
– gerrit
Nov 26 '14 at 17:25
2
@gerrit: Too bad this motivation is not explained in the answer itself. (Moreover, the answer has to explaination at all at the moment.)
– vog
Jan 15 '17 at 21:42
1
This... is extremely clever. While non-human-readable, this one-liner successfully preserves both the type and ordering (e.g., forOrderedDict
types) of the original dictionary by passing an anonymous iterable to thedict(iterable)
form of mapping constructors. Explanatory exposition would have been helpful, of course.</sigh>
– Cecil Curry
Dec 22 '17 at 6:37
1
Clever it may be, but it doesn't work when more than one key has the same value in the original dictionary.
– Rafael_Espericueta
Jun 5 '18 at 1:02
add a comment |
11
Upvoted for retaining the type rather than silently converting into dict
– gerrit
Nov 26 '14 at 17:25
2
@gerrit: Too bad this motivation is not explained in the answer itself. (Moreover, the answer has to explaination at all at the moment.)
– vog
Jan 15 '17 at 21:42
1
This... is extremely clever. While non-human-readable, this one-liner successfully preserves both the type and ordering (e.g., forOrderedDict
types) of the original dictionary by passing an anonymous iterable to thedict(iterable)
form of mapping constructors. Explanatory exposition would have been helpful, of course.</sigh>
– Cecil Curry
Dec 22 '17 at 6:37
1
Clever it may be, but it doesn't work when more than one key has the same value in the original dictionary.
– Rafael_Espericueta
Jun 5 '18 at 1:02
11
11
Upvoted for retaining the type rather than silently converting into dict
– gerrit
Nov 26 '14 at 17:25
Upvoted for retaining the type rather than silently converting into dict
– gerrit
Nov 26 '14 at 17:25
2
2
@gerrit: Too bad this motivation is not explained in the answer itself. (Moreover, the answer has to explaination at all at the moment.)
– vog
Jan 15 '17 at 21:42
@gerrit: Too bad this motivation is not explained in the answer itself. (Moreover, the answer has to explaination at all at the moment.)
– vog
Jan 15 '17 at 21:42
1
1
This... is extremely clever. While non-human-readable, this one-liner successfully preserves both the type and ordering (e.g., for
OrderedDict
types) of the original dictionary by passing an anonymous iterable to the dict(iterable)
form of mapping constructors. Explanatory exposition would have been helpful, of course. </sigh>
– Cecil Curry
Dec 22 '17 at 6:37
This... is extremely clever. While non-human-readable, this one-liner successfully preserves both the type and ordering (e.g., for
OrderedDict
types) of the original dictionary by passing an anonymous iterable to the dict(iterable)
form of mapping constructors. Explanatory exposition would have been helpful, of course. </sigh>
– Cecil Curry
Dec 22 '17 at 6:37
1
1
Clever it may be, but it doesn't work when more than one key has the same value in the original dictionary.
– Rafael_Espericueta
Jun 5 '18 at 1:02
Clever it may be, but it doesn't work when more than one key has the same value in the original dictionary.
– Rafael_Espericueta
Jun 5 '18 at 1:02
add a comment |
Try this:
inv_map = dict(zip(my_map.values(), my_map.keys()))
(Note that the Python docs on dictionary views explicitly guarantee that .keys()
and .values()
have their elements in the same order, which allows the approach above to work.)
Alternatively:
inv_map = dict((my_map[k], k) for k in my_map)
or using python 3.0's dict comprehensions
inv_map = {my_map[k] : k for k in my_map}
Notice that this only works if the keys are unique (which is almost never the case if you want to invert them).
– gented
Jun 22 '18 at 8:26
According to python.org/dev/peps/pep-0274 dict comprehensions are available in 2.7+, too.
– Kawu
Oct 27 '18 at 1:03
add a comment |
Try this:
inv_map = dict(zip(my_map.values(), my_map.keys()))
(Note that the Python docs on dictionary views explicitly guarantee that .keys()
and .values()
have their elements in the same order, which allows the approach above to work.)
Alternatively:
inv_map = dict((my_map[k], k) for k in my_map)
or using python 3.0's dict comprehensions
inv_map = {my_map[k] : k for k in my_map}
Notice that this only works if the keys are unique (which is almost never the case if you want to invert them).
– gented
Jun 22 '18 at 8:26
According to python.org/dev/peps/pep-0274 dict comprehensions are available in 2.7+, too.
– Kawu
Oct 27 '18 at 1:03
add a comment |
Try this:
inv_map = dict(zip(my_map.values(), my_map.keys()))
(Note that the Python docs on dictionary views explicitly guarantee that .keys()
and .values()
have their elements in the same order, which allows the approach above to work.)
Alternatively:
inv_map = dict((my_map[k], k) for k in my_map)
or using python 3.0's dict comprehensions
inv_map = {my_map[k] : k for k in my_map}
Try this:
inv_map = dict(zip(my_map.values(), my_map.keys()))
(Note that the Python docs on dictionary views explicitly guarantee that .keys()
and .values()
have their elements in the same order, which allows the approach above to work.)
Alternatively:
inv_map = dict((my_map[k], k) for k in my_map)
or using python 3.0's dict comprehensions
inv_map = {my_map[k] : k for k in my_map}
edited Aug 21 '16 at 12:51
Rick Teachey
15.6k73965
15.6k73965
answered Jan 27 '09 at 14:49
sykorasykora
60.1k95567
60.1k95567
Notice that this only works if the keys are unique (which is almost never the case if you want to invert them).
– gented
Jun 22 '18 at 8:26
According to python.org/dev/peps/pep-0274 dict comprehensions are available in 2.7+, too.
– Kawu
Oct 27 '18 at 1:03
add a comment |
Notice that this only works if the keys are unique (which is almost never the case if you want to invert them).
– gented
Jun 22 '18 at 8:26
According to python.org/dev/peps/pep-0274 dict comprehensions are available in 2.7+, too.
– Kawu
Oct 27 '18 at 1:03
Notice that this only works if the keys are unique (which is almost never the case if you want to invert them).
– gented
Jun 22 '18 at 8:26
Notice that this only works if the keys are unique (which is almost never the case if you want to invert them).
– gented
Jun 22 '18 at 8:26
According to python.org/dev/peps/pep-0274 dict comprehensions are available in 2.7+, too.
– Kawu
Oct 27 '18 at 1:03
According to python.org/dev/peps/pep-0274 dict comprehensions are available in 2.7+, too.
– Kawu
Oct 27 '18 at 1:03
add a comment |
Another, more functional, way:
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
2
Thanks for posting. I am not sure this is preferable - to quote Guido Van Rossum in PEP 279: "filter
andmap
should die and be subsumed into list comprehensions, not grow more variants".
– Brian M. Hunt
Feb 26 '14 at 16:38
1
Yeah, that's a fair point Brian. I was just adding it as a point of conversation. The dict comprehension way is more readable for most I'd imagine. (And likely faster too I'd guess)
– Brendan Maguire
Feb 26 '14 at 17:10
2
In Python 3 it should bemy_map.items()
.
– dmvianna
Jul 25 '16 at 23:47
1
Might be less readable than others, but this way does have the benefit of being able to swap outdict
with other mapping types such ascollections.OrderedDict
orcollections.defaultdict
– Will S
Aug 17 '17 at 9:51
add a comment |
Another, more functional, way:
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
2
Thanks for posting. I am not sure this is preferable - to quote Guido Van Rossum in PEP 279: "filter
andmap
should die and be subsumed into list comprehensions, not grow more variants".
– Brian M. Hunt
Feb 26 '14 at 16:38
1
Yeah, that's a fair point Brian. I was just adding it as a point of conversation. The dict comprehension way is more readable for most I'd imagine. (And likely faster too I'd guess)
– Brendan Maguire
Feb 26 '14 at 17:10
2
In Python 3 it should bemy_map.items()
.
– dmvianna
Jul 25 '16 at 23:47
1
Might be less readable than others, but this way does have the benefit of being able to swap outdict
with other mapping types such ascollections.OrderedDict
orcollections.defaultdict
– Will S
Aug 17 '17 at 9:51
add a comment |
Another, more functional, way:
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
Another, more functional, way:
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
edited Jan 5 '17 at 14:51
answered Feb 26 '14 at 16:35
Brendan MaguireBrendan Maguire
1,74421523
1,74421523
2
Thanks for posting. I am not sure this is preferable - to quote Guido Van Rossum in PEP 279: "filter
andmap
should die and be subsumed into list comprehensions, not grow more variants".
– Brian M. Hunt
Feb 26 '14 at 16:38
1
Yeah, that's a fair point Brian. I was just adding it as a point of conversation. The dict comprehension way is more readable for most I'd imagine. (And likely faster too I'd guess)
– Brendan Maguire
Feb 26 '14 at 17:10
2
In Python 3 it should bemy_map.items()
.
– dmvianna
Jul 25 '16 at 23:47
1
Might be less readable than others, but this way does have the benefit of being able to swap outdict
with other mapping types such ascollections.OrderedDict
orcollections.defaultdict
– Will S
Aug 17 '17 at 9:51
add a comment |
2
Thanks for posting. I am not sure this is preferable - to quote Guido Van Rossum in PEP 279: "filter
andmap
should die and be subsumed into list comprehensions, not grow more variants".
– Brian M. Hunt
Feb 26 '14 at 16:38
1
Yeah, that's a fair point Brian. I was just adding it as a point of conversation. The dict comprehension way is more readable for most I'd imagine. (And likely faster too I'd guess)
– Brendan Maguire
Feb 26 '14 at 17:10
2
In Python 3 it should bemy_map.items()
.
– dmvianna
Jul 25 '16 at 23:47
1
Might be less readable than others, but this way does have the benefit of being able to swap outdict
with other mapping types such ascollections.OrderedDict
orcollections.defaultdict
– Will S
Aug 17 '17 at 9:51
2
2
Thanks for posting. I am not sure this is preferable - to quote Guido Van Rossum in PEP 279: "
filter
and map
should die and be subsumed into list comprehensions, not grow more variants".– Brian M. Hunt
Feb 26 '14 at 16:38
Thanks for posting. I am not sure this is preferable - to quote Guido Van Rossum in PEP 279: "
filter
and map
should die and be subsumed into list comprehensions, not grow more variants".– Brian M. Hunt
Feb 26 '14 at 16:38
1
1
Yeah, that's a fair point Brian. I was just adding it as a point of conversation. The dict comprehension way is more readable for most I'd imagine. (And likely faster too I'd guess)
– Brendan Maguire
Feb 26 '14 at 17:10
Yeah, that's a fair point Brian. I was just adding it as a point of conversation. The dict comprehension way is more readable for most I'd imagine. (And likely faster too I'd guess)
– Brendan Maguire
Feb 26 '14 at 17:10
2
2
In Python 3 it should be
my_map.items()
.– dmvianna
Jul 25 '16 at 23:47
In Python 3 it should be
my_map.items()
.– dmvianna
Jul 25 '16 at 23:47
1
1
Might be less readable than others, but this way does have the benefit of being able to swap out
dict
with other mapping types such as collections.OrderedDict
or collections.defaultdict
– Will S
Aug 17 '17 at 9:51
Might be less readable than others, but this way does have the benefit of being able to swap out
dict
with other mapping types such as collections.OrderedDict
or collections.defaultdict
– Will S
Aug 17 '17 at 9:51
add a comment |
This expands upon the answer Python reverse / invert a mapping, applying to when the values in the dict aren't unique.
class ReversibleDict(dict):
def reversed(self):
"""
Return a reversed dict, with common values in the original dict
grouped into a list in the returned dict.
Example:
>>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
>>> d.reversed()
{1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
"""
revdict = {}
for k, v in self.iteritems():
revdict.setdefault(v, ).append(k)
return revdict
The implementation is limited in that you cannot use reversed
twice and get the original back. It is not symmetric as such. It is tested with Python 2.6. Here is a use case of how I am using to print the resultant dict.
If you'd rather use a set
than a list
, and there are applications for which this makes sense, instead of setdefault(v, ).append(k)
, use setdefault(v, set()).add(k)
.
this would also be a good place to use sets instead of lists, i.e.revdict.setdefault(v, set()).add(k)
– mueslo
Dec 22 '16 at 20:42
Of course, but that's exacty why it's a good reason to useset
. It's the intrinsic type that applies here. What if I want to find all keys where the values are not1
or2
? Then I can just dod.keys() - inv_d[1] - inv_d[2]
(in Python 3)
– mueslo
Dec 22 '16 at 20:57
add a comment |
This expands upon the answer Python reverse / invert a mapping, applying to when the values in the dict aren't unique.
class ReversibleDict(dict):
def reversed(self):
"""
Return a reversed dict, with common values in the original dict
grouped into a list in the returned dict.
Example:
>>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
>>> d.reversed()
{1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
"""
revdict = {}
for k, v in self.iteritems():
revdict.setdefault(v, ).append(k)
return revdict
The implementation is limited in that you cannot use reversed
twice and get the original back. It is not symmetric as such. It is tested with Python 2.6. Here is a use case of how I am using to print the resultant dict.
If you'd rather use a set
than a list
, and there are applications for which this makes sense, instead of setdefault(v, ).append(k)
, use setdefault(v, set()).add(k)
.
this would also be a good place to use sets instead of lists, i.e.revdict.setdefault(v, set()).add(k)
– mueslo
Dec 22 '16 at 20:42
Of course, but that's exacty why it's a good reason to useset
. It's the intrinsic type that applies here. What if I want to find all keys where the values are not1
or2
? Then I can just dod.keys() - inv_d[1] - inv_d[2]
(in Python 3)
– mueslo
Dec 22 '16 at 20:57
add a comment |
This expands upon the answer Python reverse / invert a mapping, applying to when the values in the dict aren't unique.
class ReversibleDict(dict):
def reversed(self):
"""
Return a reversed dict, with common values in the original dict
grouped into a list in the returned dict.
Example:
>>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
>>> d.reversed()
{1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
"""
revdict = {}
for k, v in self.iteritems():
revdict.setdefault(v, ).append(k)
return revdict
The implementation is limited in that you cannot use reversed
twice and get the original back. It is not symmetric as such. It is tested with Python 2.6. Here is a use case of how I am using to print the resultant dict.
If you'd rather use a set
than a list
, and there are applications for which this makes sense, instead of setdefault(v, ).append(k)
, use setdefault(v, set()).add(k)
.
This expands upon the answer Python reverse / invert a mapping, applying to when the values in the dict aren't unique.
class ReversibleDict(dict):
def reversed(self):
"""
Return a reversed dict, with common values in the original dict
grouped into a list in the returned dict.
Example:
>>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
>>> d.reversed()
{1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
"""
revdict = {}
for k, v in self.iteritems():
revdict.setdefault(v, ).append(k)
return revdict
The implementation is limited in that you cannot use reversed
twice and get the original back. It is not symmetric as such. It is tested with Python 2.6. Here is a use case of how I am using to print the resultant dict.
If you'd rather use a set
than a list
, and there are applications for which this makes sense, instead of setdefault(v, ).append(k)
, use setdefault(v, set()).add(k)
.
edited May 23 '17 at 11:54
Community♦
11
11
answered Oct 24 '12 at 20:40
A-B-BA-B-B
23.3k66369
23.3k66369
this would also be a good place to use sets instead of lists, i.e.revdict.setdefault(v, set()).add(k)
– mueslo
Dec 22 '16 at 20:42
Of course, but that's exacty why it's a good reason to useset
. It's the intrinsic type that applies here. What if I want to find all keys where the values are not1
or2
? Then I can just dod.keys() - inv_d[1] - inv_d[2]
(in Python 3)
– mueslo
Dec 22 '16 at 20:57
add a comment |
this would also be a good place to use sets instead of lists, i.e.revdict.setdefault(v, set()).add(k)
– mueslo
Dec 22 '16 at 20:42
Of course, but that's exacty why it's a good reason to useset
. It's the intrinsic type that applies here. What if I want to find all keys where the values are not1
or2
? Then I can just dod.keys() - inv_d[1] - inv_d[2]
(in Python 3)
– mueslo
Dec 22 '16 at 20:57
this would also be a good place to use sets instead of lists, i.e.
revdict.setdefault(v, set()).add(k)
– mueslo
Dec 22 '16 at 20:42
this would also be a good place to use sets instead of lists, i.e.
revdict.setdefault(v, set()).add(k)
– mueslo
Dec 22 '16 at 20:42
Of course, but that's exacty why it's a good reason to use
set
. It's the intrinsic type that applies here. What if I want to find all keys where the values are not 1
or 2
? Then I can just do d.keys() - inv_d[1] - inv_d[2]
(in Python 3)– mueslo
Dec 22 '16 at 20:57
Of course, but that's exacty why it's a good reason to use
set
. It's the intrinsic type that applies here. What if I want to find all keys where the values are not 1
or 2
? Then I can just do d.keys() - inv_d[1] - inv_d[2]
(in Python 3)– mueslo
Dec 22 '16 at 20:57
add a comment |
Combination of list and dictionary comprehension. Can handle duplicate keys
{v:[i for i in d.keys() if d[i] == v ] for k,v in d.items()}
add a comment |
Combination of list and dictionary comprehension. Can handle duplicate keys
{v:[i for i in d.keys() if d[i] == v ] for k,v in d.items()}
add a comment |
Combination of list and dictionary comprehension. Can handle duplicate keys
{v:[i for i in d.keys() if d[i] == v ] for k,v in d.items()}
Combination of list and dictionary comprehension. Can handle duplicate keys
{v:[i for i in d.keys() if d[i] == v ] for k,v in d.items()}
edited Apr 19 '18 at 3:28
user6655984
answered Apr 19 '18 at 3:24
SVJSVJ
6112
6112
add a comment |
add a comment |
Adding my 2 cents of pythonic way:
inv_map = dict(map(reversed, my_map.items()))
Example:
In [7]: my_map
Out[7]: {1: 'one', 2: 'two', 3: 'three'}
In [8]: inv_map = dict(map(reversed, my_map.items()))
In [9]: inv_map
Out[9]: {'one': 1, 'three': 3, 'two': 2}
This is a clone of Brendan Maguire's answer which has been given three years before.
– Adrian W
Sep 20 '18 at 10:01
add a comment |
Adding my 2 cents of pythonic way:
inv_map = dict(map(reversed, my_map.items()))
Example:
In [7]: my_map
Out[7]: {1: 'one', 2: 'two', 3: 'three'}
In [8]: inv_map = dict(map(reversed, my_map.items()))
In [9]: inv_map
Out[9]: {'one': 1, 'three': 3, 'two': 2}
This is a clone of Brendan Maguire's answer which has been given three years before.
– Adrian W
Sep 20 '18 at 10:01
add a comment |
Adding my 2 cents of pythonic way:
inv_map = dict(map(reversed, my_map.items()))
Example:
In [7]: my_map
Out[7]: {1: 'one', 2: 'two', 3: 'three'}
In [8]: inv_map = dict(map(reversed, my_map.items()))
In [9]: inv_map
Out[9]: {'one': 1, 'three': 3, 'two': 2}
Adding my 2 cents of pythonic way:
inv_map = dict(map(reversed, my_map.items()))
Example:
In [7]: my_map
Out[7]: {1: 'one', 2: 'two', 3: 'three'}
In [8]: inv_map = dict(map(reversed, my_map.items()))
In [9]: inv_map
Out[9]: {'one': 1, 'three': 3, 'two': 2}
answered Apr 3 '17 at 5:39
Amit KushwahaAmit Kushwaha
1,0741011
1,0741011
This is a clone of Brendan Maguire's answer which has been given three years before.
– Adrian W
Sep 20 '18 at 10:01
add a comment |
This is a clone of Brendan Maguire's answer which has been given three years before.
– Adrian W
Sep 20 '18 at 10:01
This is a clone of Brendan Maguire's answer which has been given three years before.
– Adrian W
Sep 20 '18 at 10:01
This is a clone of Brendan Maguire's answer which has been given three years before.
– Adrian W
Sep 20 '18 at 10:01
add a comment |
If the values aren't unique, and you're a little hardcore:
inv_map = dict(
(v, [k for (k, xx) in filter(lambda (key, value): value == v, my_map.items())])
for v in set(my_map.values())
)
Especially for a large dict, note that this solution is far less efficient than the answer Python reverse / invert a mapping because it loops over items()
multiple times.
5
This is just plain unreadable and a good example of how to not write maintainable code. I won't-1
because it still answers the question, just my opinion.
– Russ Bradberry
Oct 3 '12 at 19:19
add a comment |
If the values aren't unique, and you're a little hardcore:
inv_map = dict(
(v, [k for (k, xx) in filter(lambda (key, value): value == v, my_map.items())])
for v in set(my_map.values())
)
Especially for a large dict, note that this solution is far less efficient than the answer Python reverse / invert a mapping because it loops over items()
multiple times.
5
This is just plain unreadable and a good example of how to not write maintainable code. I won't-1
because it still answers the question, just my opinion.
– Russ Bradberry
Oct 3 '12 at 19:19
add a comment |
If the values aren't unique, and you're a little hardcore:
inv_map = dict(
(v, [k for (k, xx) in filter(lambda (key, value): value == v, my_map.items())])
for v in set(my_map.values())
)
Especially for a large dict, note that this solution is far less efficient than the answer Python reverse / invert a mapping because it loops over items()
multiple times.
If the values aren't unique, and you're a little hardcore:
inv_map = dict(
(v, [k for (k, xx) in filter(lambda (key, value): value == v, my_map.items())])
for v in set(my_map.values())
)
Especially for a large dict, note that this solution is far less efficient than the answer Python reverse / invert a mapping because it loops over items()
multiple times.
edited May 23 '17 at 12:34
Community♦
11
11
answered Apr 17 '10 at 20:14
pcvpcv
1,3711520
1,3711520
5
This is just plain unreadable and a good example of how to not write maintainable code. I won't-1
because it still answers the question, just my opinion.
– Russ Bradberry
Oct 3 '12 at 19:19
add a comment |
5
This is just plain unreadable and a good example of how to not write maintainable code. I won't-1
because it still answers the question, just my opinion.
– Russ Bradberry
Oct 3 '12 at 19:19
5
5
This is just plain unreadable and a good example of how to not write maintainable code. I won't
-1
because it still answers the question, just my opinion.– Russ Bradberry
Oct 3 '12 at 19:19
This is just plain unreadable and a good example of how to not write maintainable code. I won't
-1
because it still answers the question, just my opinion.– Russ Bradberry
Oct 3 '12 at 19:19
add a comment |
We may also reverse a dictionary with duplicate keys using defaultdict
:
from collections import Counter, defaultdict
def invert_dict(d):
d_inv = defaultdict(list)
for k, v in c.items():
d_inv[v].append(k)
return d_inv
text = 'aaa bbb ccc ddd aaa bbb ccc aaa'
c = Counter(text.split()) # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
dict(invert_dict(c)) # {1: ['ddd'], 2: ['bbb', 'ccc'], 3: ['aaa']}
See here:
This technique is simpler and faster than an equivalent technique using
dict.setdefault()
.
add a comment |
We may also reverse a dictionary with duplicate keys using defaultdict
:
from collections import Counter, defaultdict
def invert_dict(d):
d_inv = defaultdict(list)
for k, v in c.items():
d_inv[v].append(k)
return d_inv
text = 'aaa bbb ccc ddd aaa bbb ccc aaa'
c = Counter(text.split()) # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
dict(invert_dict(c)) # {1: ['ddd'], 2: ['bbb', 'ccc'], 3: ['aaa']}
See here:
This technique is simpler and faster than an equivalent technique using
dict.setdefault()
.
add a comment |
We may also reverse a dictionary with duplicate keys using defaultdict
:
from collections import Counter, defaultdict
def invert_dict(d):
d_inv = defaultdict(list)
for k, v in c.items():
d_inv[v].append(k)
return d_inv
text = 'aaa bbb ccc ddd aaa bbb ccc aaa'
c = Counter(text.split()) # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
dict(invert_dict(c)) # {1: ['ddd'], 2: ['bbb', 'ccc'], 3: ['aaa']}
See here:
This technique is simpler and faster than an equivalent technique using
dict.setdefault()
.
We may also reverse a dictionary with duplicate keys using defaultdict
:
from collections import Counter, defaultdict
def invert_dict(d):
d_inv = defaultdict(list)
for k, v in c.items():
d_inv[v].append(k)
return d_inv
text = 'aaa bbb ccc ddd aaa bbb ccc aaa'
c = Counter(text.split()) # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
dict(invert_dict(c)) # {1: ['ddd'], 2: ['bbb', 'ccc'], 3: ['aaa']}
See here:
This technique is simpler and faster than an equivalent technique using
dict.setdefault()
.
edited Dec 26 '16 at 23:14
answered Dec 26 '16 at 23:01
irudyakirudyak
76269
76269
add a comment |
add a comment |
In addition to the other functions suggested above, if you like lambdas:
invert = lambda mydict: {v:k for k, v in mydict.items()}
Or, you could do it this way too:
invert = lambda mydict: dict( zip(mydict.values(), mydict.keys()) )
-1; all you've done is taken other answers from the page and put them into a lambda. Also, assigning a lambda to a variable is a PEP 8 violation.
– Mark Amery
Jul 16 '16 at 18:03
add a comment |
In addition to the other functions suggested above, if you like lambdas:
invert = lambda mydict: {v:k for k, v in mydict.items()}
Or, you could do it this way too:
invert = lambda mydict: dict( zip(mydict.values(), mydict.keys()) )
-1; all you've done is taken other answers from the page and put them into a lambda. Also, assigning a lambda to a variable is a PEP 8 violation.
– Mark Amery
Jul 16 '16 at 18:03
add a comment |
In addition to the other functions suggested above, if you like lambdas:
invert = lambda mydict: {v:k for k, v in mydict.items()}
Or, you could do it this way too:
invert = lambda mydict: dict( zip(mydict.values(), mydict.keys()) )
In addition to the other functions suggested above, if you like lambdas:
invert = lambda mydict: {v:k for k, v in mydict.items()}
Or, you could do it this way too:
invert = lambda mydict: dict( zip(mydict.values(), mydict.keys()) )
edited Mar 8 '14 at 21:28
answered Apr 9 '13 at 19:20
RussellStewartRussellStewart
3,95512022
3,95512022
-1; all you've done is taken other answers from the page and put them into a lambda. Also, assigning a lambda to a variable is a PEP 8 violation.
– Mark Amery
Jul 16 '16 at 18:03
add a comment |
-1; all you've done is taken other answers from the page and put them into a lambda. Also, assigning a lambda to a variable is a PEP 8 violation.
– Mark Amery
Jul 16 '16 at 18:03
-1; all you've done is taken other answers from the page and put them into a lambda. Also, assigning a lambda to a variable is a PEP 8 violation.
– Mark Amery
Jul 16 '16 at 18:03
-1; all you've done is taken other answers from the page and put them into a lambda. Also, assigning a lambda to a variable is a PEP 8 violation.
– Mark Amery
Jul 16 '16 at 18:03
add a comment |
This handles non-unique values and retains much of the look of the unique case.
inv_map = {v:[k for k in my_map if my_map[k] == v] for v in my_map.itervalues()}
For Python 3.x, replace itervalues with values.
I can't take credit for this... it was suggested by Icon Jack.
This solution is quite elegant as a one liner and it manages the non unique values case. However it has a complexity in O(n2) which means it should be ok for several dozens of elements but it would be too slow for practical use if you have several hundreds of thousands of elements in your initial dictionary. The solutions based on a default dict are way faster than this one.
– gabuzo
Oct 24 '17 at 8:21
Gabuzo is quite right. This version is (arguably) clearer than some, but it is not suitable for large data.
– Ersatz Kwisatz
Oct 25 '17 at 17:01
add a comment |
This handles non-unique values and retains much of the look of the unique case.
inv_map = {v:[k for k in my_map if my_map[k] == v] for v in my_map.itervalues()}
For Python 3.x, replace itervalues with values.
I can't take credit for this... it was suggested by Icon Jack.
This solution is quite elegant as a one liner and it manages the non unique values case. However it has a complexity in O(n2) which means it should be ok for several dozens of elements but it would be too slow for practical use if you have several hundreds of thousands of elements in your initial dictionary. The solutions based on a default dict are way faster than this one.
– gabuzo
Oct 24 '17 at 8:21
Gabuzo is quite right. This version is (arguably) clearer than some, but it is not suitable for large data.
– Ersatz Kwisatz
Oct 25 '17 at 17:01
add a comment |
This handles non-unique values and retains much of the look of the unique case.
inv_map = {v:[k for k in my_map if my_map[k] == v] for v in my_map.itervalues()}
For Python 3.x, replace itervalues with values.
I can't take credit for this... it was suggested by Icon Jack.
This handles non-unique values and retains much of the look of the unique case.
inv_map = {v:[k for k in my_map if my_map[k] == v] for v in my_map.itervalues()}
For Python 3.x, replace itervalues with values.
I can't take credit for this... it was suggested by Icon Jack.
edited Jan 25 '17 at 20:29
miken32
23.8k84972
23.8k84972
answered Jan 25 '17 at 20:23
Ersatz KwisatzErsatz Kwisatz
413
413
This solution is quite elegant as a one liner and it manages the non unique values case. However it has a complexity in O(n2) which means it should be ok for several dozens of elements but it would be too slow for practical use if you have several hundreds of thousands of elements in your initial dictionary. The solutions based on a default dict are way faster than this one.
– gabuzo
Oct 24 '17 at 8:21
Gabuzo is quite right. This version is (arguably) clearer than some, but it is not suitable for large data.
– Ersatz Kwisatz
Oct 25 '17 at 17:01
add a comment |
This solution is quite elegant as a one liner and it manages the non unique values case. However it has a complexity in O(n2) which means it should be ok for several dozens of elements but it would be too slow for practical use if you have several hundreds of thousands of elements in your initial dictionary. The solutions based on a default dict are way faster than this one.
– gabuzo
Oct 24 '17 at 8:21
Gabuzo is quite right. This version is (arguably) clearer than some, but it is not suitable for large data.
– Ersatz Kwisatz
Oct 25 '17 at 17:01
This solution is quite elegant as a one liner and it manages the non unique values case. However it has a complexity in O(n2) which means it should be ok for several dozens of elements but it would be too slow for practical use if you have several hundreds of thousands of elements in your initial dictionary. The solutions based on a default dict are way faster than this one.
– gabuzo
Oct 24 '17 at 8:21
This solution is quite elegant as a one liner and it manages the non unique values case. However it has a complexity in O(n2) which means it should be ok for several dozens of elements but it would be too slow for practical use if you have several hundreds of thousands of elements in your initial dictionary. The solutions based on a default dict are way faster than this one.
– gabuzo
Oct 24 '17 at 8:21
Gabuzo is quite right. This version is (arguably) clearer than some, but it is not suitable for large data.
– Ersatz Kwisatz
Oct 25 '17 at 17:01
Gabuzo is quite right. This version is (arguably) clearer than some, but it is not suitable for large data.
– Ersatz Kwisatz
Oct 25 '17 at 17:01
add a comment |
I think the best way to do this is to define a class. Here is an implementation of a "symmetric dictionary":
class SymDict:
def __init__(self):
self.aToB = {}
self.bToA = {}
def assocAB(self, a, b):
# Stores and returns a tuple (a,b) of overwritten bindings
currB = None
if a in self.aToB: currB = self.bToA[a]
currA = None
if b in self.bToA: currA = self.aToB[b]
self.aToB[a] = b
self.bToA[b] = a
return (currA, currB)
def lookupA(self, a):
if a in self.aToB:
return self.aToB[a]
return None
def lookupB(self, b):
if b in self.bToA:
return self.bToA[b]
return None
Deletion and iteration methods are easy enough to implement if they're needed.
This implementation is way more efficient than inverting an entire dictionary (which seems to be the most popular solution on this page). Not to mention, you can add or remove values from your SymDict as much as you want, and your inverse-dictionary will always stay valid -- this isn't true if you simply reverse the entire dictionary once.
I like this idea, though it would be good to note that it trades off additional memory to achieve improved computation. A happier medium may be caching or lazily computing the mirror. It is also worth noting that it could be made more syntactically appealing with e.g. dictionary views and custom operators.
– Brian M. Hunt
Sep 28 '14 at 10:59
@BrianM.Hunt It trades off memory, but not a lot. You only store two sets of pointers to each object. If your objects are much bigger than single integers, this won't make much of a difference. If you have huge table of tiny objects on the other hand, you might need to consider those suggestions...
– NcAdams
Sep 28 '14 at 20:46
And I agree, there's more to be done here -- I might flesh this out into a fully functioning datatype later
– NcAdams
Sep 28 '14 at 20:47
1
"This implementation is way more efficient than inverting an entire dictionary" - um, why? I don't see any plausible way this approach can have a significant performance benefit; you've still got two dictionaries this way. If anything, I'd expect this to be slower than, say, inverting the dict with a comprehension, because if you invert the dict Python can plausibly know in advance how many buckets to allocate in the underlying C data structure and create the inverse map without ever callingdictresize
, but this approach denies Python that possibility.
– Mark Amery
Jul 16 '16 at 18:11
add a comment |
I think the best way to do this is to define a class. Here is an implementation of a "symmetric dictionary":
class SymDict:
def __init__(self):
self.aToB = {}
self.bToA = {}
def assocAB(self, a, b):
# Stores and returns a tuple (a,b) of overwritten bindings
currB = None
if a in self.aToB: currB = self.bToA[a]
currA = None
if b in self.bToA: currA = self.aToB[b]
self.aToB[a] = b
self.bToA[b] = a
return (currA, currB)
def lookupA(self, a):
if a in self.aToB:
return self.aToB[a]
return None
def lookupB(self, b):
if b in self.bToA:
return self.bToA[b]
return None
Deletion and iteration methods are easy enough to implement if they're needed.
This implementation is way more efficient than inverting an entire dictionary (which seems to be the most popular solution on this page). Not to mention, you can add or remove values from your SymDict as much as you want, and your inverse-dictionary will always stay valid -- this isn't true if you simply reverse the entire dictionary once.
I like this idea, though it would be good to note that it trades off additional memory to achieve improved computation. A happier medium may be caching or lazily computing the mirror. It is also worth noting that it could be made more syntactically appealing with e.g. dictionary views and custom operators.
– Brian M. Hunt
Sep 28 '14 at 10:59
@BrianM.Hunt It trades off memory, but not a lot. You only store two sets of pointers to each object. If your objects are much bigger than single integers, this won't make much of a difference. If you have huge table of tiny objects on the other hand, you might need to consider those suggestions...
– NcAdams
Sep 28 '14 at 20:46
And I agree, there's more to be done here -- I might flesh this out into a fully functioning datatype later
– NcAdams
Sep 28 '14 at 20:47
1
"This implementation is way more efficient than inverting an entire dictionary" - um, why? I don't see any plausible way this approach can have a significant performance benefit; you've still got two dictionaries this way. If anything, I'd expect this to be slower than, say, inverting the dict with a comprehension, because if you invert the dict Python can plausibly know in advance how many buckets to allocate in the underlying C data structure and create the inverse map without ever callingdictresize
, but this approach denies Python that possibility.
– Mark Amery
Jul 16 '16 at 18:11
add a comment |
I think the best way to do this is to define a class. Here is an implementation of a "symmetric dictionary":
class SymDict:
def __init__(self):
self.aToB = {}
self.bToA = {}
def assocAB(self, a, b):
# Stores and returns a tuple (a,b) of overwritten bindings
currB = None
if a in self.aToB: currB = self.bToA[a]
currA = None
if b in self.bToA: currA = self.aToB[b]
self.aToB[a] = b
self.bToA[b] = a
return (currA, currB)
def lookupA(self, a):
if a in self.aToB:
return self.aToB[a]
return None
def lookupB(self, b):
if b in self.bToA:
return self.bToA[b]
return None
Deletion and iteration methods are easy enough to implement if they're needed.
This implementation is way more efficient than inverting an entire dictionary (which seems to be the most popular solution on this page). Not to mention, you can add or remove values from your SymDict as much as you want, and your inverse-dictionary will always stay valid -- this isn't true if you simply reverse the entire dictionary once.
I think the best way to do this is to define a class. Here is an implementation of a "symmetric dictionary":
class SymDict:
def __init__(self):
self.aToB = {}
self.bToA = {}
def assocAB(self, a, b):
# Stores and returns a tuple (a,b) of overwritten bindings
currB = None
if a in self.aToB: currB = self.bToA[a]
currA = None
if b in self.bToA: currA = self.aToB[b]
self.aToB[a] = b
self.bToA[b] = a
return (currA, currB)
def lookupA(self, a):
if a in self.aToB:
return self.aToB[a]
return None
def lookupB(self, b):
if b in self.bToA:
return self.bToA[b]
return None
Deletion and iteration methods are easy enough to implement if they're needed.
This implementation is way more efficient than inverting an entire dictionary (which seems to be the most popular solution on this page). Not to mention, you can add or remove values from your SymDict as much as you want, and your inverse-dictionary will always stay valid -- this isn't true if you simply reverse the entire dictionary once.
edited Sep 28 '14 at 7:18
answered Sep 28 '14 at 6:50
NcAdamsNcAdams
80531225
80531225
I like this idea, though it would be good to note that it trades off additional memory to achieve improved computation. A happier medium may be caching or lazily computing the mirror. It is also worth noting that it could be made more syntactically appealing with e.g. dictionary views and custom operators.
– Brian M. Hunt
Sep 28 '14 at 10:59
@BrianM.Hunt It trades off memory, but not a lot. You only store two sets of pointers to each object. If your objects are much bigger than single integers, this won't make much of a difference. If you have huge table of tiny objects on the other hand, you might need to consider those suggestions...
– NcAdams
Sep 28 '14 at 20:46
And I agree, there's more to be done here -- I might flesh this out into a fully functioning datatype later
– NcAdams
Sep 28 '14 at 20:47
1
"This implementation is way more efficient than inverting an entire dictionary" - um, why? I don't see any plausible way this approach can have a significant performance benefit; you've still got two dictionaries this way. If anything, I'd expect this to be slower than, say, inverting the dict with a comprehension, because if you invert the dict Python can plausibly know in advance how many buckets to allocate in the underlying C data structure and create the inverse map without ever callingdictresize
, but this approach denies Python that possibility.
– Mark Amery
Jul 16 '16 at 18:11
add a comment |
I like this idea, though it would be good to note that it trades off additional memory to achieve improved computation. A happier medium may be caching or lazily computing the mirror. It is also worth noting that it could be made more syntactically appealing with e.g. dictionary views and custom operators.
– Brian M. Hunt
Sep 28 '14 at 10:59
@BrianM.Hunt It trades off memory, but not a lot. You only store two sets of pointers to each object. If your objects are much bigger than single integers, this won't make much of a difference. If you have huge table of tiny objects on the other hand, you might need to consider those suggestions...
– NcAdams
Sep 28 '14 at 20:46
And I agree, there's more to be done here -- I might flesh this out into a fully functioning datatype later
– NcAdams
Sep 28 '14 at 20:47
1
"This implementation is way more efficient than inverting an entire dictionary" - um, why? I don't see any plausible way this approach can have a significant performance benefit; you've still got two dictionaries this way. If anything, I'd expect this to be slower than, say, inverting the dict with a comprehension, because if you invert the dict Python can plausibly know in advance how many buckets to allocate in the underlying C data structure and create the inverse map without ever callingdictresize
, but this approach denies Python that possibility.
– Mark Amery
Jul 16 '16 at 18:11
I like this idea, though it would be good to note that it trades off additional memory to achieve improved computation. A happier medium may be caching or lazily computing the mirror. It is also worth noting that it could be made more syntactically appealing with e.g. dictionary views and custom operators.
– Brian M. Hunt
Sep 28 '14 at 10:59
I like this idea, though it would be good to note that it trades off additional memory to achieve improved computation. A happier medium may be caching or lazily computing the mirror. It is also worth noting that it could be made more syntactically appealing with e.g. dictionary views and custom operators.
– Brian M. Hunt
Sep 28 '14 at 10:59
@BrianM.Hunt It trades off memory, but not a lot. You only store two sets of pointers to each object. If your objects are much bigger than single integers, this won't make much of a difference. If you have huge table of tiny objects on the other hand, you might need to consider those suggestions...
– NcAdams
Sep 28 '14 at 20:46
@BrianM.Hunt It trades off memory, but not a lot. You only store two sets of pointers to each object. If your objects are much bigger than single integers, this won't make much of a difference. If you have huge table of tiny objects on the other hand, you might need to consider those suggestions...
– NcAdams
Sep 28 '14 at 20:46
And I agree, there's more to be done here -- I might flesh this out into a fully functioning datatype later
– NcAdams
Sep 28 '14 at 20:47
And I agree, there's more to be done here -- I might flesh this out into a fully functioning datatype later
– NcAdams
Sep 28 '14 at 20:47
1
1
"This implementation is way more efficient than inverting an entire dictionary" - um, why? I don't see any plausible way this approach can have a significant performance benefit; you've still got two dictionaries this way. If anything, I'd expect this to be slower than, say, inverting the dict with a comprehension, because if you invert the dict Python can plausibly know in advance how many buckets to allocate in the underlying C data structure and create the inverse map without ever calling
dictresize
, but this approach denies Python that possibility.– Mark Amery
Jul 16 '16 at 18:11
"This implementation is way more efficient than inverting an entire dictionary" - um, why? I don't see any plausible way this approach can have a significant performance benefit; you've still got two dictionaries this way. If anything, I'd expect this to be slower than, say, inverting the dict with a comprehension, because if you invert the dict Python can plausibly know in advance how many buckets to allocate in the underlying C data structure and create the inverse map without ever calling
dictresize
, but this approach denies Python that possibility.– Mark Amery
Jul 16 '16 at 18:11
add a comment |
Using zip
inv_map = dict(zip(my_map.values(), my_map.keys()))
add a comment |
Using zip
inv_map = dict(zip(my_map.values(), my_map.keys()))
add a comment |
Using zip
inv_map = dict(zip(my_map.values(), my_map.keys()))
Using zip
inv_map = dict(zip(my_map.values(), my_map.keys()))
answered Sep 11 '16 at 22:26
Kwaw AnnorKwaw Annor
9441010
9441010
add a comment |
add a comment |
Try this for python 2.7/3.x
inv_map={};
for i in my_map:
inv_map[my_map[i]]=i
print inv_map
add a comment |
Try this for python 2.7/3.x
inv_map={};
for i in my_map:
inv_map[my_map[i]]=i
print inv_map
add a comment |
Try this for python 2.7/3.x
inv_map={};
for i in my_map:
inv_map[my_map[i]]=i
print inv_map
Try this for python 2.7/3.x
inv_map={};
for i in my_map:
inv_map[my_map[i]]=i
print inv_map
edited Aug 21 '16 at 12:56
Rick Teachey
15.6k73965
15.6k73965
answered Jul 25 '14 at 9:31
dhvlnykdhvlnyk
77111
77111
add a comment |
add a comment |
I would do it that way in python 2.
inv_map = {my_map[x] : x for x in my_map}
add a comment |
I would do it that way in python 2.
inv_map = {my_map[x] : x for x in my_map}
add a comment |
I would do it that way in python 2.
inv_map = {my_map[x] : x for x in my_map}
I would do it that way in python 2.
inv_map = {my_map[x] : x for x in my_map}
edited Aug 2 '17 at 22:24
Cedar
6112
6112
answered Apr 26 '17 at 14:28
genghiscradegenghiscrade
111
111
add a comment |
add a comment |
def invertDictionary(d):
myDict = {}
for i in d:
value = d.get(i)
myDict.setdefault(value,).append(i)
return myDict
print invertDictionary({'a':1, 'b':2, 'c':3 , 'd' : 1})
This will provide output as : {1: ['a', 'd'], 2: ['b'], 3: ['c']}
add a comment |
def invertDictionary(d):
myDict = {}
for i in d:
value = d.get(i)
myDict.setdefault(value,).append(i)
return myDict
print invertDictionary({'a':1, 'b':2, 'c':3 , 'd' : 1})
This will provide output as : {1: ['a', 'd'], 2: ['b'], 3: ['c']}
add a comment |
def invertDictionary(d):
myDict = {}
for i in d:
value = d.get(i)
myDict.setdefault(value,).append(i)
return myDict
print invertDictionary({'a':1, 'b':2, 'c':3 , 'd' : 1})
This will provide output as : {1: ['a', 'd'], 2: ['b'], 3: ['c']}
def invertDictionary(d):
myDict = {}
for i in d:
value = d.get(i)
myDict.setdefault(value,).append(i)
return myDict
print invertDictionary({'a':1, 'b':2, 'c':3 , 'd' : 1})
This will provide output as : {1: ['a', 'd'], 2: ['b'], 3: ['c']}
answered Aug 30 '17 at 10:11
RVRRVR
30239
30239
add a comment |
add a comment |
def reverse_dictionary(input_dict):
out = {}
for v in input_dict.values():
for value in v:
if value not in out:
out[value.lower()] =
for i in input_dict:
for j in out:
if j in map (lambda x : x.lower(),input_dict[i]):
out[j].append(i.lower())
out[j].sort()
return out
this code do like this:
r = reverse_dictionary({'Accurate': ['exact', 'precise'], 'exact': ['precise'], 'astute': ['Smart', 'clever'], 'smart': ['clever', 'bright', 'talented']})
print(r)
{'precise': ['accurate', 'exact'], 'clever': ['astute', 'smart'], 'talented': ['smart'], 'bright': ['smart'], 'exact': ['accurate'], 'smart': ['astute']}
Generally, answers are much more helpful if they include an explanation of what the code is intended to do, and why that solves the problem without introducing others.
– Tom Aranda
Dec 18 '17 at 16:17
It is a nice solution
– Dr Beco
Jul 14 '18 at 16:06
It's very nice, but a lot of unexplained decisions (for example, why lower case for keys?)
– Liudvikas Akelis
Sep 7 '18 at 12:49
add a comment |
def reverse_dictionary(input_dict):
out = {}
for v in input_dict.values():
for value in v:
if value not in out:
out[value.lower()] =
for i in input_dict:
for j in out:
if j in map (lambda x : x.lower(),input_dict[i]):
out[j].append(i.lower())
out[j].sort()
return out
this code do like this:
r = reverse_dictionary({'Accurate': ['exact', 'precise'], 'exact': ['precise'], 'astute': ['Smart', 'clever'], 'smart': ['clever', 'bright', 'talented']})
print(r)
{'precise': ['accurate', 'exact'], 'clever': ['astute', 'smart'], 'talented': ['smart'], 'bright': ['smart'], 'exact': ['accurate'], 'smart': ['astute']}
Generally, answers are much more helpful if they include an explanation of what the code is intended to do, and why that solves the problem without introducing others.
– Tom Aranda
Dec 18 '17 at 16:17
It is a nice solution
– Dr Beco
Jul 14 '18 at 16:06
It's very nice, but a lot of unexplained decisions (for example, why lower case for keys?)
– Liudvikas Akelis
Sep 7 '18 at 12:49
add a comment |
def reverse_dictionary(input_dict):
out = {}
for v in input_dict.values():
for value in v:
if value not in out:
out[value.lower()] =
for i in input_dict:
for j in out:
if j in map (lambda x : x.lower(),input_dict[i]):
out[j].append(i.lower())
out[j].sort()
return out
this code do like this:
r = reverse_dictionary({'Accurate': ['exact', 'precise'], 'exact': ['precise'], 'astute': ['Smart', 'clever'], 'smart': ['clever', 'bright', 'talented']})
print(r)
{'precise': ['accurate', 'exact'], 'clever': ['astute', 'smart'], 'talented': ['smart'], 'bright': ['smart'], 'exact': ['accurate'], 'smart': ['astute']}
def reverse_dictionary(input_dict):
out = {}
for v in input_dict.values():
for value in v:
if value not in out:
out[value.lower()] =
for i in input_dict:
for j in out:
if j in map (lambda x : x.lower(),input_dict[i]):
out[j].append(i.lower())
out[j].sort()
return out
this code do like this:
r = reverse_dictionary({'Accurate': ['exact', 'precise'], 'exact': ['precise'], 'astute': ['Smart', 'clever'], 'smart': ['clever', 'bright', 'talented']})
print(r)
{'precise': ['accurate', 'exact'], 'clever': ['astute', 'smart'], 'talented': ['smart'], 'bright': ['smart'], 'exact': ['accurate'], 'smart': ['astute']}
edited Jul 14 '18 at 16:06
Dr Beco
6,94353959
6,94353959
answered Dec 18 '17 at 16:11
Shb8086Shb8086
111
111
Generally, answers are much more helpful if they include an explanation of what the code is intended to do, and why that solves the problem without introducing others.
– Tom Aranda
Dec 18 '17 at 16:17
It is a nice solution
– Dr Beco
Jul 14 '18 at 16:06
It's very nice, but a lot of unexplained decisions (for example, why lower case for keys?)
– Liudvikas Akelis
Sep 7 '18 at 12:49
add a comment |
Generally, answers are much more helpful if they include an explanation of what the code is intended to do, and why that solves the problem without introducing others.
– Tom Aranda
Dec 18 '17 at 16:17
It is a nice solution
– Dr Beco
Jul 14 '18 at 16:06
It's very nice, but a lot of unexplained decisions (for example, why lower case for keys?)
– Liudvikas Akelis
Sep 7 '18 at 12:49
Generally, answers are much more helpful if they include an explanation of what the code is intended to do, and why that solves the problem without introducing others.
– Tom Aranda
Dec 18 '17 at 16:17
Generally, answers are much more helpful if they include an explanation of what the code is intended to do, and why that solves the problem without introducing others.
– Tom Aranda
Dec 18 '17 at 16:17
It is a nice solution
– Dr Beco
Jul 14 '18 at 16:06
It is a nice solution
– Dr Beco
Jul 14 '18 at 16:06
It's very nice, but a lot of unexplained decisions (for example, why lower case for keys?)
– Liudvikas Akelis
Sep 7 '18 at 12:49
It's very nice, but a lot of unexplained decisions (for example, why lower case for keys?)
– Liudvikas Akelis
Sep 7 '18 at 12:49
add a comment |
Function is symmetric for values of type list; Tuples are coverted to lists when performing reverse_dict(reverse_dict(dictionary))
def reverse_dict(dictionary):
reverse_dict = {}
for key, value in dictionary.iteritems():
if not isinstance(value, (list, tuple)):
value = [value]
for val in value:
reverse_dict[val] = reverse_dict.get(val, )
reverse_dict[val].append(key)
for key, value in reverse_dict.iteritems():
if len(value) == 1:
reverse_dict[key] = value[0]
return reverse_dict
add a comment |
Function is symmetric for values of type list; Tuples are coverted to lists when performing reverse_dict(reverse_dict(dictionary))
def reverse_dict(dictionary):
reverse_dict = {}
for key, value in dictionary.iteritems():
if not isinstance(value, (list, tuple)):
value = [value]
for val in value:
reverse_dict[val] = reverse_dict.get(val, )
reverse_dict[val].append(key)
for key, value in reverse_dict.iteritems():
if len(value) == 1:
reverse_dict[key] = value[0]
return reverse_dict
add a comment |
Function is symmetric for values of type list; Tuples are coverted to lists when performing reverse_dict(reverse_dict(dictionary))
def reverse_dict(dictionary):
reverse_dict = {}
for key, value in dictionary.iteritems():
if not isinstance(value, (list, tuple)):
value = [value]
for val in value:
reverse_dict[val] = reverse_dict.get(val, )
reverse_dict[val].append(key)
for key, value in reverse_dict.iteritems():
if len(value) == 1:
reverse_dict[key] = value[0]
return reverse_dict
Function is symmetric for values of type list; Tuples are coverted to lists when performing reverse_dict(reverse_dict(dictionary))
def reverse_dict(dictionary):
reverse_dict = {}
for key, value in dictionary.iteritems():
if not isinstance(value, (list, tuple)):
value = [value]
for val in value:
reverse_dict[val] = reverse_dict.get(val, )
reverse_dict[val].append(key)
for key, value in reverse_dict.iteritems():
if len(value) == 1:
reverse_dict[key] = value[0]
return reverse_dict
edited Sep 24 '14 at 12:29
answered Sep 24 '14 at 12:23
AlfAlf
93
93
add a comment |
add a comment |
Since dictionaries require one unique key within the dictionary unlike values, we have to append the reversed values into a list of sort to be included within the new specific keys.
def r_maping(dictionary):
List_z=
Map= {}
for z, x in dictionary.iteritems(): #iterate through the keys and values
Map.setdefault(x,List_z).append(z) #Setdefault is the same as dict[key]=default."The method returns the key value available in the dictionary and if given key is not available then it will return provided default value. Afterward, we will append into the default list our new values for the specific key.
return Map
add a comment |
Since dictionaries require one unique key within the dictionary unlike values, we have to append the reversed values into a list of sort to be included within the new specific keys.
def r_maping(dictionary):
List_z=
Map= {}
for z, x in dictionary.iteritems(): #iterate through the keys and values
Map.setdefault(x,List_z).append(z) #Setdefault is the same as dict[key]=default."The method returns the key value available in the dictionary and if given key is not available then it will return provided default value. Afterward, we will append into the default list our new values for the specific key.
return Map
add a comment |
Since dictionaries require one unique key within the dictionary unlike values, we have to append the reversed values into a list of sort to be included within the new specific keys.
def r_maping(dictionary):
List_z=
Map= {}
for z, x in dictionary.iteritems(): #iterate through the keys and values
Map.setdefault(x,List_z).append(z) #Setdefault is the same as dict[key]=default."The method returns the key value available in the dictionary and if given key is not available then it will return provided default value. Afterward, we will append into the default list our new values for the specific key.
return Map
Since dictionaries require one unique key within the dictionary unlike values, we have to append the reversed values into a list of sort to be included within the new specific keys.
def r_maping(dictionary):
List_z=
Map= {}
for z, x in dictionary.iteritems(): #iterate through the keys and values
Map.setdefault(x,List_z).append(z) #Setdefault is the same as dict[key]=default."The method returns the key value available in the dictionary and if given key is not available then it will return provided default value. Afterward, we will append into the default list our new values for the specific key.
return Map
edited Jan 9 '16 at 1:38
answered Jan 9 '16 at 1:26
EyoelDEyoelD
4651516
4651516
add a comment |
add a comment |
Not something completely different, just a bit rewritten recipe from Cookbook. It's futhermore optimized by retaining setdefault
method, instead of each time getting it through the instance:
def inverse(mapping):
'''
A function to inverse mapping, collecting keys with simillar values
in list. Careful to retain original type and to be fast.
>> d = dict(a=1, b=2, c=1, d=3, e=2, f=1, g=5, h=2)
>> inverse(d)
{1: ['f', 'c', 'a'], 2: ['h', 'b', 'e'], 3: ['d'], 5: ['g']}
'''
res = {}
setdef = res.setdefault
for key, value in mapping.items():
setdef(value, ).append(key)
return res if mapping.__class__==dict else mapping.__class__(res)
Designed to be run under CPython 3.x, for 2.x replace mapping.items()
with mapping.iteritems()
On my machine runs a bit faster, than other examples here
add a comment |
Not something completely different, just a bit rewritten recipe from Cookbook. It's futhermore optimized by retaining setdefault
method, instead of each time getting it through the instance:
def inverse(mapping):
'''
A function to inverse mapping, collecting keys with simillar values
in list. Careful to retain original type and to be fast.
>> d = dict(a=1, b=2, c=1, d=3, e=2, f=1, g=5, h=2)
>> inverse(d)
{1: ['f', 'c', 'a'], 2: ['h', 'b', 'e'], 3: ['d'], 5: ['g']}
'''
res = {}
setdef = res.setdefault
for key, value in mapping.items():
setdef(value, ).append(key)
return res if mapping.__class__==dict else mapping.__class__(res)
Designed to be run under CPython 3.x, for 2.x replace mapping.items()
with mapping.iteritems()
On my machine runs a bit faster, than other examples here
add a comment |
Not something completely different, just a bit rewritten recipe from Cookbook. It's futhermore optimized by retaining setdefault
method, instead of each time getting it through the instance:
def inverse(mapping):
'''
A function to inverse mapping, collecting keys with simillar values
in list. Careful to retain original type and to be fast.
>> d = dict(a=1, b=2, c=1, d=3, e=2, f=1, g=5, h=2)
>> inverse(d)
{1: ['f', 'c', 'a'], 2: ['h', 'b', 'e'], 3: ['d'], 5: ['g']}
'''
res = {}
setdef = res.setdefault
for key, value in mapping.items():
setdef(value, ).append(key)
return res if mapping.__class__==dict else mapping.__class__(res)
Designed to be run under CPython 3.x, for 2.x replace mapping.items()
with mapping.iteritems()
On my machine runs a bit faster, than other examples here
Not something completely different, just a bit rewritten recipe from Cookbook. It's futhermore optimized by retaining setdefault
method, instead of each time getting it through the instance:
def inverse(mapping):
'''
A function to inverse mapping, collecting keys with simillar values
in list. Careful to retain original type and to be fast.
>> d = dict(a=1, b=2, c=1, d=3, e=2, f=1, g=5, h=2)
>> inverse(d)
{1: ['f', 'c', 'a'], 2: ['h', 'b', 'e'], 3: ['d'], 5: ['g']}
'''
res = {}
setdef = res.setdefault
for key, value in mapping.items():
setdef(value, ).append(key)
return res if mapping.__class__==dict else mapping.__class__(res)
Designed to be run under CPython 3.x, for 2.x replace mapping.items()
with mapping.iteritems()
On my machine runs a bit faster, than other examples here
answered Aug 2 '16 at 18:08
thodnevthodnev
970616
970616
add a comment |
add a comment |
If values aren't unique AND may be a hash (one dimension):
for k, v in myDict.items():
if len(v) > 1:
for item in v:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
And with a recursion if you need to dig deeper then just one dimension:
def digList(lst):
temp =
for item in lst:
if type(item) is list:
temp.append(digList(item))
else:
temp.append(item)
return set(temp)
for k, v in myDict.items():
if type(v) is list:
items = digList(v)
for item in items:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
You might improve your solutions using a defaultdict: it'll remove all the invDict[item] = invDict.get(item, ) lines
– gabuzo
Oct 24 '17 at 8:22
add a comment |
If values aren't unique AND may be a hash (one dimension):
for k, v in myDict.items():
if len(v) > 1:
for item in v:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
And with a recursion if you need to dig deeper then just one dimension:
def digList(lst):
temp =
for item in lst:
if type(item) is list:
temp.append(digList(item))
else:
temp.append(item)
return set(temp)
for k, v in myDict.items():
if type(v) is list:
items = digList(v)
for item in items:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
You might improve your solutions using a defaultdict: it'll remove all the invDict[item] = invDict.get(item, ) lines
– gabuzo
Oct 24 '17 at 8:22
add a comment |
If values aren't unique AND may be a hash (one dimension):
for k, v in myDict.items():
if len(v) > 1:
for item in v:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
And with a recursion if you need to dig deeper then just one dimension:
def digList(lst):
temp =
for item in lst:
if type(item) is list:
temp.append(digList(item))
else:
temp.append(item)
return set(temp)
for k, v in myDict.items():
if type(v) is list:
items = digList(v)
for item in items:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
If values aren't unique AND may be a hash (one dimension):
for k, v in myDict.items():
if len(v) > 1:
for item in v:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
And with a recursion if you need to dig deeper then just one dimension:
def digList(lst):
temp =
for item in lst:
if type(item) is list:
temp.append(digList(item))
else:
temp.append(item)
return set(temp)
for k, v in myDict.items():
if type(v) is list:
items = digList(v)
for item in items:
invDict[item] = invDict.get(item, )
invDict[item].append(k)
else:
invDict[v] = invDict.get(v, )
invDict[v].append(k)
edited Jan 10 '17 at 11:06
answered Jan 10 '17 at 10:37
mveithmveith
13
13
You might improve your solutions using a defaultdict: it'll remove all the invDict[item] = invDict.get(item, ) lines
– gabuzo
Oct 24 '17 at 8:22
add a comment |
You might improve your solutions using a defaultdict: it'll remove all the invDict[item] = invDict.get(item, ) lines
– gabuzo
Oct 24 '17 at 8:22
You might improve your solutions using a defaultdict: it'll remove all the invDict[item] = invDict.get(item, ) lines
– gabuzo
Oct 24 '17 at 8:22
You might improve your solutions using a defaultdict: it'll remove all the invDict[item] = invDict.get(item, ) lines
– gabuzo
Oct 24 '17 at 8:22
add a comment |
Inverse your dictionary:
dict_ = {"k0":"v0", "k1":"v1", "k2":"v1"}
inversed_dict_ = {val: key for key, val in dict_.items()}
print(inversed_dict_["v1"])
add a comment |
Inverse your dictionary:
dict_ = {"k0":"v0", "k1":"v1", "k2":"v1"}
inversed_dict_ = {val: key for key, val in dict_.items()}
print(inversed_dict_["v1"])
add a comment |
Inverse your dictionary:
dict_ = {"k0":"v0", "k1":"v1", "k2":"v1"}
inversed_dict_ = {val: key for key, val in dict_.items()}
print(inversed_dict_["v1"])
Inverse your dictionary:
dict_ = {"k0":"v0", "k1":"v1", "k2":"v1"}
inversed_dict_ = {val: key for key, val in dict_.items()}
print(inversed_dict_["v1"])
answered Jun 7 '18 at 23:37
MiladioussMiladiouss
553614
553614
add a comment |
add a comment |
As per my comment to the question. I think the easiest and one liner which works for both Python2 and Python 3 will be
dict(zip(inv_map.values(), inv_map.keys()))
add a comment |
As per my comment to the question. I think the easiest and one liner which works for both Python2 and Python 3 will be
dict(zip(inv_map.values(), inv_map.keys()))
add a comment |
As per my comment to the question. I think the easiest and one liner which works for both Python2 and Python 3 will be
dict(zip(inv_map.values(), inv_map.keys()))
As per my comment to the question. I think the easiest and one liner which works for both Python2 and Python 3 will be
dict(zip(inv_map.values(), inv_map.keys()))
answered Nov 7 '18 at 22:36
Seshadri VSSeshadri VS
308114
308114
add a comment |
add a comment |
For instance, you have the following dictionary:
dict = {'a': 'fire', 'b': 'ice', 'c': 'fire', 'd': 'water'}
And you wanna get it in such an inverted form:
inverted_dict = {'fire': ['a', 'c'], 'ice': ['b'], 'water': ['d']}
First Solution. For inverting key-value pairs in your dictionary use a for
-loop approach:
# Use this code to invert dictionaries that have non-unique values
inverted_dict = dictio()
for key, value in dict.items():
inverted_dict.setdefault(value, list()).append(key)
Second Solution. Use a dictionary comprehension approach for inversion:
# Use this code to invert dictionaries that have unique values
inverted_dict = {value: key for key, value in dict.items()}
Third Solution. Use reverting the inversion approach:
# Use this code to invert dictionaries that have lists of values
dict = {value: key for key in inverted_dict for value in my_map[key]}
add a comment |
For instance, you have the following dictionary:
dict = {'a': 'fire', 'b': 'ice', 'c': 'fire', 'd': 'water'}
And you wanna get it in such an inverted form:
inverted_dict = {'fire': ['a', 'c'], 'ice': ['b'], 'water': ['d']}
First Solution. For inverting key-value pairs in your dictionary use a for
-loop approach:
# Use this code to invert dictionaries that have non-unique values
inverted_dict = dictio()
for key, value in dict.items():
inverted_dict.setdefault(value, list()).append(key)
Second Solution. Use a dictionary comprehension approach for inversion:
# Use this code to invert dictionaries that have unique values
inverted_dict = {value: key for key, value in dict.items()}
Third Solution. Use reverting the inversion approach:
# Use this code to invert dictionaries that have lists of values
dict = {value: key for key in inverted_dict for value in my_map[key]}
add a comment |
For instance, you have the following dictionary:
dict = {'a': 'fire', 'b': 'ice', 'c': 'fire', 'd': 'water'}
And you wanna get it in such an inverted form:
inverted_dict = {'fire': ['a', 'c'], 'ice': ['b'], 'water': ['d']}
First Solution. For inverting key-value pairs in your dictionary use a for
-loop approach:
# Use this code to invert dictionaries that have non-unique values
inverted_dict = dictio()
for key, value in dict.items():
inverted_dict.setdefault(value, list()).append(key)
Second Solution. Use a dictionary comprehension approach for inversion:
# Use this code to invert dictionaries that have unique values
inverted_dict = {value: key for key, value in dict.items()}
Third Solution. Use reverting the inversion approach:
# Use this code to invert dictionaries that have lists of values
dict = {value: key for key in inverted_dict for value in my_map[key]}
For instance, you have the following dictionary:
dict = {'a': 'fire', 'b': 'ice', 'c': 'fire', 'd': 'water'}
And you wanna get it in such an inverted form:
inverted_dict = {'fire': ['a', 'c'], 'ice': ['b'], 'water': ['d']}
First Solution. For inverting key-value pairs in your dictionary use a for
-loop approach:
# Use this code to invert dictionaries that have non-unique values
inverted_dict = dictio()
for key, value in dict.items():
inverted_dict.setdefault(value, list()).append(key)
Second Solution. Use a dictionary comprehension approach for inversion:
# Use this code to invert dictionaries that have unique values
inverted_dict = {value: key for key, value in dict.items()}
Third Solution. Use reverting the inversion approach:
# Use this code to invert dictionaries that have lists of values
dict = {value: key for key in inverted_dict for value in my_map[key]}
edited Jan 20 at 14:13
Martijn Pieters♦
711k13724812301
711k13724812301
answered Jan 10 at 5:55
ARGeoARGeo
5,27952649
5,27952649
add a comment |
add a comment |
Fast functional solution for non-bijective maps (values not unique):
from itertools import imap, groupby
def fst(s):
return s[0]
def snd(s):
return s[1]
def inverseDict(d):
"""
input d: a -> b
output : b -> set(a)
"""
return {
v : set(imap(fst, kv_iter))
for (v, kv_iter) in groupby(
sorted(d.iteritems(),
key=snd),
key=snd
)
}
In theory this should be faster than adding to the set (or appending to the list) one by one like in the imperative solution.
Unfortunately the values have to be sortable, the sorting is required by groupby.
"In theory this should be faster than adding to the set (or appending to the list) one by one" - no. Givenn
elements in the original dict, your approach hasO(n log n)
time complexity due to the need to sort the dict's items, whereas the naive imperative approach hasO(n)
time complexity. For all I know your approach may be faster up until absurdly largedict
s in practice, but it certainly isn't faster in theory.
– Mark Amery
Jul 16 '16 at 18:17
add a comment |
Fast functional solution for non-bijective maps (values not unique):
from itertools import imap, groupby
def fst(s):
return s[0]
def snd(s):
return s[1]
def inverseDict(d):
"""
input d: a -> b
output : b -> set(a)
"""
return {
v : set(imap(fst, kv_iter))
for (v, kv_iter) in groupby(
sorted(d.iteritems(),
key=snd),
key=snd
)
}
In theory this should be faster than adding to the set (or appending to the list) one by one like in the imperative solution.
Unfortunately the values have to be sortable, the sorting is required by groupby.
"In theory this should be faster than adding to the set (or appending to the list) one by one" - no. Givenn
elements in the original dict, your approach hasO(n log n)
time complexity due to the need to sort the dict's items, whereas the naive imperative approach hasO(n)
time complexity. For all I know your approach may be faster up until absurdly largedict
s in practice, but it certainly isn't faster in theory.
– Mark Amery
Jul 16 '16 at 18:17
add a comment |
Fast functional solution for non-bijective maps (values not unique):
from itertools import imap, groupby
def fst(s):
return s[0]
def snd(s):
return s[1]
def inverseDict(d):
"""
input d: a -> b
output : b -> set(a)
"""
return {
v : set(imap(fst, kv_iter))
for (v, kv_iter) in groupby(
sorted(d.iteritems(),
key=snd),
key=snd
)
}
In theory this should be faster than adding to the set (or appending to the list) one by one like in the imperative solution.
Unfortunately the values have to be sortable, the sorting is required by groupby.
Fast functional solution for non-bijective maps (values not unique):
from itertools import imap, groupby
def fst(s):
return s[0]
def snd(s):
return s[1]
def inverseDict(d):
"""
input d: a -> b
output : b -> set(a)
"""
return {
v : set(imap(fst, kv_iter))
for (v, kv_iter) in groupby(
sorted(d.iteritems(),
key=snd),
key=snd
)
}
In theory this should be faster than adding to the set (or appending to the list) one by one like in the imperative solution.
Unfortunately the values have to be sortable, the sorting is required by groupby.
edited May 23 '17 at 12:10
Community♦
11
11
answered Mar 6 '14 at 20:50
cjaycjay
152
152
"In theory this should be faster than adding to the set (or appending to the list) one by one" - no. Givenn
elements in the original dict, your approach hasO(n log n)
time complexity due to the need to sort the dict's items, whereas the naive imperative approach hasO(n)
time complexity. For all I know your approach may be faster up until absurdly largedict
s in practice, but it certainly isn't faster in theory.
– Mark Amery
Jul 16 '16 at 18:17
add a comment |
"In theory this should be faster than adding to the set (or appending to the list) one by one" - no. Givenn
elements in the original dict, your approach hasO(n log n)
time complexity due to the need to sort the dict's items, whereas the naive imperative approach hasO(n)
time complexity. For all I know your approach may be faster up until absurdly largedict
s in practice, but it certainly isn't faster in theory.
– Mark Amery
Jul 16 '16 at 18:17
"In theory this should be faster than adding to the set (or appending to the list) one by one" - no. Given
n
elements in the original dict, your approach has O(n log n)
time complexity due to the need to sort the dict's items, whereas the naive imperative approach has O(n)
time complexity. For all I know your approach may be faster up until absurdly large dict
s in practice, but it certainly isn't faster in theory.– Mark Amery
Jul 16 '16 at 18:17
"In theory this should be faster than adding to the set (or appending to the list) one by one" - no. Given
n
elements in the original dict, your approach has O(n log n)
time complexity due to the need to sort the dict's items, whereas the naive imperative approach has O(n)
time complexity. For all I know your approach may be faster up until absurdly large dict
s in practice, but it certainly isn't faster in theory.– Mark Amery
Jul 16 '16 at 18:17
add a comment |
I wrote this with the help of cycle 'for' and method '.get()' and I changed the name 'map' of the dictionary to 'map1' because 'map' is a function.
def dict_invert(map1):
inv_map = {} # new dictionary
for key in map1.keys():
inv_map[map1.get(key)] = key
return inv_map
add a comment |
I wrote this with the help of cycle 'for' and method '.get()' and I changed the name 'map' of the dictionary to 'map1' because 'map' is a function.
def dict_invert(map1):
inv_map = {} # new dictionary
for key in map1.keys():
inv_map[map1.get(key)] = key
return inv_map
add a comment |
I wrote this with the help of cycle 'for' and method '.get()' and I changed the name 'map' of the dictionary to 'map1' because 'map' is a function.
def dict_invert(map1):
inv_map = {} # new dictionary
for key in map1.keys():
inv_map[map1.get(key)] = key
return inv_map
I wrote this with the help of cycle 'for' and method '.get()' and I changed the name 'map' of the dictionary to 'map1' because 'map' is a function.
def dict_invert(map1):
inv_map = {} # new dictionary
for key in map1.keys():
inv_map[map1.get(key)] = key
return inv_map
edited Aug 5 '16 at 21:14
answered Aug 5 '16 at 19:47
Taras VoitovychTaras Voitovych
92
92
add a comment |
add a comment |
For all kinds of dictionary, no matter if they don't have unique values to use as keys, you can create a list of keys for each value
inv_map = {v: inv_map.get(v, ) + [k] for k,v in my_map.items()}
have you tested it for non-unique values? e.g.map = { 'a': 1, 'b':2, 'c':1 }
gives{1: ['c'], 2: ['b']}
forinv_map
,'a'
gets lost (I putinv_map = {}
before your line)
– Matthias 009
May 1 '12 at 16:36
1
This doesn't work, because the new value ofinv_map
is not assigned until the comprehension completes
– Eric
Jul 30 '14 at 15:11
add a comment |
For all kinds of dictionary, no matter if they don't have unique values to use as keys, you can create a list of keys for each value
inv_map = {v: inv_map.get(v, ) + [k] for k,v in my_map.items()}
have you tested it for non-unique values? e.g.map = { 'a': 1, 'b':2, 'c':1 }
gives{1: ['c'], 2: ['b']}
forinv_map
,'a'
gets lost (I putinv_map = {}
before your line)
– Matthias 009
May 1 '12 at 16:36
1
This doesn't work, because the new value ofinv_map
is not assigned until the comprehension completes
– Eric
Jul 30 '14 at 15:11
add a comment |
For all kinds of dictionary, no matter if they don't have unique values to use as keys, you can create a list of keys for each value
inv_map = {v: inv_map.get(v, ) + [k] for k,v in my_map.items()}
For all kinds of dictionary, no matter if they don't have unique values to use as keys, you can create a list of keys for each value
inv_map = {v: inv_map.get(v, ) + [k] for k,v in my_map.items()}
edited Aug 21 '16 at 12:53
Rick Teachey
15.6k73965
15.6k73965
answered Nov 1 '10 at 17:55
becobeco
111
111
have you tested it for non-unique values? e.g.map = { 'a': 1, 'b':2, 'c':1 }
gives{1: ['c'], 2: ['b']}
forinv_map
,'a'
gets lost (I putinv_map = {}
before your line)
– Matthias 009
May 1 '12 at 16:36
1
This doesn't work, because the new value ofinv_map
is not assigned until the comprehension completes
– Eric
Jul 30 '14 at 15:11
add a comment |
have you tested it for non-unique values? e.g.map = { 'a': 1, 'b':2, 'c':1 }
gives{1: ['c'], 2: ['b']}
forinv_map
,'a'
gets lost (I putinv_map = {}
before your line)
– Matthias 009
May 1 '12 at 16:36
1
This doesn't work, because the new value ofinv_map
is not assigned until the comprehension completes
– Eric
Jul 30 '14 at 15:11
have you tested it for non-unique values? e.g.
map = { 'a': 1, 'b':2, 'c':1 }
gives {1: ['c'], 2: ['b']}
for inv_map
, 'a'
gets lost (I put inv_map = {}
before your line)– Matthias 009
May 1 '12 at 16:36
have you tested it for non-unique values? e.g.
map = { 'a': 1, 'b':2, 'c':1 }
gives {1: ['c'], 2: ['b']}
for inv_map
, 'a'
gets lost (I put inv_map = {}
before your line)– Matthias 009
May 1 '12 at 16:36
1
1
This doesn't work, because the new value of
inv_map
is not assigned until the comprehension completes– Eric
Jul 30 '14 at 15:11
This doesn't work, because the new value of
inv_map
is not assigned until the comprehension completes– Eric
Jul 30 '14 at 15:11
add a comment |
This is not the best solution, but it works. Let's say the dictionary we want to reverse is:
dictionary = {'a': 1, 'b': 2, 'c': 3}, then:
dictionary = {'a': 1, 'b': 2, 'c': 3}
reverse_dictionary = {}
for index, val in enumerate(list(dictionary.values())):
reverse_dictionary[val] = list(dictionary.keys())[index]
The output of reverse_dictionary, should be {1: 'a', 2: 'b', 3: 'c'}
add a comment |
This is not the best solution, but it works. Let's say the dictionary we want to reverse is:
dictionary = {'a': 1, 'b': 2, 'c': 3}, then:
dictionary = {'a': 1, 'b': 2, 'c': 3}
reverse_dictionary = {}
for index, val in enumerate(list(dictionary.values())):
reverse_dictionary[val] = list(dictionary.keys())[index]
The output of reverse_dictionary, should be {1: 'a', 2: 'b', 3: 'c'}
add a comment |
This is not the best solution, but it works. Let's say the dictionary we want to reverse is:
dictionary = {'a': 1, 'b': 2, 'c': 3}, then:
dictionary = {'a': 1, 'b': 2, 'c': 3}
reverse_dictionary = {}
for index, val in enumerate(list(dictionary.values())):
reverse_dictionary[val] = list(dictionary.keys())[index]
The output of reverse_dictionary, should be {1: 'a', 2: 'b', 3: 'c'}
This is not the best solution, but it works. Let's say the dictionary we want to reverse is:
dictionary = {'a': 1, 'b': 2, 'c': 3}, then:
dictionary = {'a': 1, 'b': 2, 'c': 3}
reverse_dictionary = {}
for index, val in enumerate(list(dictionary.values())):
reverse_dictionary[val] = list(dictionary.keys())[index]
The output of reverse_dictionary, should be {1: 'a', 2: 'b', 3: 'c'}
edited Jun 16 '18 at 12:23
answered Jun 9 '18 at 12:20
user9918114user9918114
11
11
add a comment |
add a comment |
1 2
next
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f483666%2fpython-reverse-invert-a-mapping%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
dict(zip(inv_map.values(), inv_map.keys()))
– Seshadri VS
Sep 22 '18 at 10:33
@SeshadriVS, it works (for both Python 2 and Python 3, thanks! =)
– Filipp W.
Nov 7 '18 at 9:06