I briefly covered this structure last time, but didn't do it justice. The idea of a two-way dictionary structure (keys and values are both keys) intrigued me. I wanted to give it a spin with a real world example.
I've chosen a simple example with a few domain name (common names) and ip addresses:
# dblassoc.py
import openbsd
# some ip addrsses paired with domains
ips = {'google':(0x4a7d1393, 0xd8ef3d68),
'openbsd':(0x8ef40c2a,),
'freebsd':(0x45935321,),
'yahoo':(0xd1bf5d34, 0xd183249e)}
# OK, we can now make the DoubleAssociation
ipsbothways = openbsd.utils.DoubleAssociation(ips)
print "ipsbothways['yahoo'] = " + str(ipsbothways['yahoo'])
# fair enough, but nothing we couldn't get from the dictionary
# try to query on an ip address to get a domain name
print "ipsbothways[(0x8ef40c2a,)] = " + ipsbothways[(0x8ef40c2a,)]
# unlike a normal dictionary, DoubleAssociation gives everything
# back with the keys() method
for keyx in ipsbothways.keys():
try:
if 0xd183249e in keyx:
print "domain is " + ipsbothways[keyx]
break
except TypeError:
print "TypeError: " + keyx
Python 2.5.4 (r254:67916, Jul 1 2009, 11:37:21)
[GCC 3.3.5 (propolice)] on openbsd4
Type "help", "copyright", "credits" or "license" for more information.
>>> import dblassoc
ipsbothways['yahoo'] = (3518979380L, 3515032734L)
ipsbothways[(0x8ef40c2a,)] = openbsd
TypeError: google
TypeError: openbsd
TypeError: yahoo
domain is yahoo
>>>
The one thing you have to look out for is the treatment of everything in the structure as a key - that's why I had to catch the TypeError. Everything is a value, too. The values and keys methods yield the same results.
In real life, if you had 30 or 50 or 1000 ip addresses, this would come in handy. Likewise for doctor-patient records, etc. (although the grouping of patients has to be unique, so that may not work after all - best to test both "sides" of the structure for exclusivity).
Hi Carl,
ReplyDeleteCan you talk a little bit about why the double association class is in a module named "openbsd". What does OpenBSD have to do with double associations?
@jcalderone - sorry, I wasn't explicit enough about this. openbsd is the package, utils is the module.
ReplyDeleteI don't know if DoubleAssociation is available outside the OpenBSD operating system or its ports utility (similar to apt in some Linux distros). In the previous post, I was looking to see what the py-openbsd package had to offer on OpenBSD. DoubleAssociation caught my eye.
Thanks for visiting!
Carl T.