reverse dict lookup & Relation class
castironpi at gmail.com
Fri Jan 16 10:04:08 CET 2009
On Jan 14, 7:04 pm, Chris Rebert <c... at rebertia.com> wrote:
> On Wed, Jan 14, 2009 at 4:30 PM, Aaron Brady <castiro... at gmail.com> wrote:
> > Hi, this is a continuation of something that comes up now and again
> > about reverse lookups on dictionaries, as well as a follow-up to my
> > pursuit of a Relation class from earlier.
> > Or, and this is the interesting part, use the ('identificationally')
> > same tuples in both mappings, since the object is only mentioned, not
> > used.
> > phone[ '555-963' ]= [ ( 'Joan', '555-963', '9a-5p' ) ]
> > phone[ '555-964' ]= [ ( 'Joan', '555-964', '5p-11p' ) ]
> > name[ 'Joan' ]= [ ( 'Joan', '555-963', '9a-5p' ), ( 'Joan', '555-964',
> > '5p-11p' ) ]
> > hourstocall[ '9a-5p' ]= [ ( 'Joan', '555-963', '9a-5p' ) ]
> > hourstocall[ '5p-11p' ]= [ ( 'Joan', '555-964', '5p-11p' ) ]
> > What's the best way to construct this class? Or, do you have an
> > argument that it could not be simpler than using a relational db?
> > Brainstorming, not flamestorming.
> Once you get beyond a main dict (e.g. name2phone) and one that's its
> inverse (e.g. phone2name), yeah, I'd probably say you should be using
> a relational DB for this. You could also use objects, but it sounds
> like you really want to use SQL-like querying, which isn't well-suited
> to plain objects (though it'd be fine with an ORM).
I want the simplest data structure that can hold a relation. In this
case, I would declare a new record as:
PhoneInfo( 'Joan', '555-963', '9a-5p' )
PhoneInfo( 'Joan', '555-964', '5p-11p' )
However the syntax is flexible, such as in 'PhoneInfo.add' etc.
I can query the structure myself if I can access it as an iterable of
tuples. I think I want to use named tuples.
for rec in PhoneInfo.records:
if rec.name== 'Joan':
Or I can just use itertools.ifilter.
recset= ifilter( lambda rec: rec.name== 'Joan', PhoneInfo.records )
for rec in recset:
Using objects is one advantage, since they are "live" (unserialized)
and native, such as a relation of socket connections. (SQL would
require an additional mapping object and a key to accomplish it.)
More information about the Python-list