Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > join dictionaries using keys from one & values

Reply
Thread Tools

join dictionaries using keys from one & values

 
 
ProvoWallis
Guest
Posts: n/a
 
      12-06-2005
I'm still learning python so this might be a crazy question but I
thought I would ask anyway. Can anyone tell me if it is possible to
join two dictionaries together to create a new dictionary using the
keys from the old dictionaries?

The keys in the new dictionary would be the keys from the old
dictionary one (dict1) and the values in the new dictionary would be
the keys from the old dictionary two (dict2). The keys would be joined
by matching the values from dict1 and dict2. The keys in each
dictionary are unique.

dict1 = {1:'bbb', 2:'aaa', 3:'ccc'}

dict2 = {5.01:'bbb', 6.01:'ccc', 7.01:'aaa'}

dict3 = {1 : 5.01, 3 : 6.01, 2 : 7.01}

I looked at "update" but I don't think it's what I'm looking for.

Thanks,

Greg

 
Reply With Quote
 
 
 
 
Erik Max Francis
Guest
Posts: n/a
 
      12-06-2005
ProvoWallis wrote:

> I'm still learning python so this might be a crazy question but I
> thought I would ask anyway. Can anyone tell me if it is possible to
> join two dictionaries together to create a new dictionary using the
> keys from the old dictionaries?


There is no builtin method. The usual way is to just wrap a class
around two dictionaries, one for mapping keys to values and the other
for mapping values back to keys.

--
Erik Max Francis && http://www.velocityreviews.com/forums/(E-Mail Removed) && http://www.alcyone.com/max/
San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
Yes I'm / Learning from falling / Hard lessons
-- Lamya
 
Reply With Quote
 
 
 
 
bonono@gmail.com
Guest
Posts: n/a
 
      12-06-2005

ProvoWallis wrote:
> I'm still learning python so this might be a crazy question but I
> thought I would ask anyway. Can anyone tell me if it is possible to
> join two dictionaries together to create a new dictionary using the
> keys from the old dictionaries?
>
> The keys in the new dictionary would be the keys from the old
> dictionary one (dict1) and the values in the new dictionary would be
> the keys from the old dictionary two (dict2). The keys would be joined
> by matching the values from dict1 and dict2. The keys in each
> dictionary are unique.
>
> dict1 = {1:'bbb', 2:'aaa', 3:'ccc'}
>
> dict2 = {5.01:'bbb', 6.01:'ccc', 7.01:'aaa'}
>
> dict3 = {1 : 5.01, 3 : 6.01, 2 : 7.01}
>
> I looked at "update" but I don't think it's what I'm looking for.
>
> Thanks,

If you can be sure that the value is hashable, I think you can just
invert one of the dict(key/value flipped) and a for loop to create the
new dict

dict2x = dict( ((dict2[k], k) for k in dict2.iterkeys()))
dict3 = dict(((k, dict2x[v]) for k,v in dict1.iteritems()))

This doesn't handle the case where v is in dict1 but not in dict2, it
can be filtered out though.

 
Reply With Quote
 
ProvoWallis
Guest
Posts: n/a
 
      12-06-2005
Thanks so much. I never would have been able to figure this out on my
own.

def dictionary_join(one, two):

dict2x = dict( ((dict2[k], k) for k in dict2.iterkeys()))
dict3 = dict(((k, dict2x[v]) for k,v in dict1.iteritems()))
print dict3

dict1 = {1:'bbb', 2:'aaa', 3:'ccc'}

dict2 = {'5.01':'bbb', '6.01':'ccc', '7.01':'aaa'}

dictionary_join(dict1, dict2)

 
Reply With Quote
 
Devan L
Guest
Posts: n/a
 
      12-06-2005

ProvoWallis wrote:
> Thanks so much. I never would have been able to figure this out on my
> own.
>
> def dictionary_join(one, two):
>
> dict2x = dict( ((dict2[k], k) for k in dict2.iterkeys()))
> dict3 = dict(((k, dict2x[v]) for k,v in dict1.iteritems()))
> print dict3
>
> dict1 = {1:'bbb', 2:'aaa', 3:'ccc'}
>
> dict2 = {'5.01':'bbb', '6.01':'ccc', '7.01':'aaa'}
>
> dictionary_join(dict1, dict2)


You might want to make a working function.

def join_dicts(d1,d2):
temp = dict(((d2[k], k) for k in d2.iterkeys()))
joined = dict(((k, temp[v]) for k,v in d1.iteritems()))
return joined

 
Reply With Quote
 
Alex Martelli
Guest
Posts: n/a
 
      12-06-2005
ProvoWallis <(E-Mail Removed)> wrote:
...
> The keys in the new dictionary would be the keys from the old
> dictionary one (dict1) and the values in the new dictionary would be
> the keys from the old dictionary two (dict2). The keys would be joined
> by matching the values from dict1 and dict2. The keys in each
> dictionary are unique.


....but are the VALUES unique...? That's the crucial issue and you don't
mention anything about it.

> dict1 = {1:'bbb', 2:'aaa', 3:'ccc'}
>
> dict2 = {5.01:'bbb', 6.01:'ccc', 7.01:'aaa'}
>
> dict3 = {1 : 5.01, 3 : 6.01, 2 : 7.01}


But what if in dict1 both keys 2 and 3 had a corresponding value of
'ccc' -- what would you want as a result then? What if key 1 had a
corresponding value of 'ddd' -- not a value in dict2; what would you
want THEN? Without a more complete specification, it's impossible to
tell, and one key Python principle is "in the face of ambiguity, refuse
the temptation to guess".

If values are assured to be unique, and the sets of values of the two
dictionaries are assured to be identical, then the suggestion (already
given in another post) to invert dict2 is a good idea, i.e., as a
function:

def PWmerge(d1, d2):
invd = dict((v2, k2) for k2, v2 in d2.iteritems())
return dict((k1,invd[v1]) for k1,v1 in d1.iteritems())

but without all of the above assurances, different tweaks may be needed
depending on what exactly you want to happen in the several "anomalous"
cases.


Alex
 
Reply With Quote
 
danplawson@gmail.com
Guest
Posts: n/a
 
      12-06-2005
Super simple:

dict3 = {}
for k1 in dict1.keys():
for k2 in dict2.keys():
if dict1.get(k1) == dict2[k2]:
dict3[k1] = k2

works in all cases and can be simplified to an iterated dictionary in
python 2.4

 
Reply With Quote
 
ProvoWallis
Guest
Posts: n/a
 
      12-07-2005
Thanks again. This is very helpful.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
updating dictionaries from/to dictionaries Brandon Python 12 08-15-2008 12:35 AM
Pickling dictionaries containing dictionaries: failing,recursion-style! lysdexia Python 6 12-02-2007 12:03 AM
How to do an 'inner join' with dictionaries Tim Chase Python 6 02-28-2006 02:52 AM
Keys order in dictionaries Brainwashed Python 2 06-27-2003 08:53 AM
Re: Keys order in dictionaries =?ISO-8859-1?Q?Gerhard_H=E4ring?= Python 0 06-26-2003 11:34 PM



Advertisments