Re: Multiple values for one key

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • norseman

    Re: Multiple values for one key

    Terry Reedy wrote:
    >
    >
    Ron Brennan wrote:
    >Hello,
    >>
    >>
    >How would I create a dictionary that contains multiple values for one
    >key.
    >
    Make the value a collection object (set or list if you plan to add and
    delete).
    >
    > I'd also like the key to be able to have duplicate entries.
    >
    Dict keys must be hashable and unique.
    >
    tjr
    >
    --

    >
    =============== =
    First part I understand, second is still giving me a problem.

    For some reason I still want keys to be dbf column headers.
    like:

    name:address:zi p so forth
    ---- ------- --- ------------------
    guy: unknown:00000
    girl: 123 tiny street:12345
    boy:321 here:33333
    gal:999 over there: 55555
    so forth

    Thus one key has many values. And you can then index on whatever key(s)
    you wish - name,zip...

    With billions plus records, trying to put a unique key on each entry
    seems to preclude the need for a dictionary, just use the entries.
    (Format to SDF and index on substr(line,1,2 4)+substr(line, 48,+5) etc..)
    name + zip
    OK - I know I missed the whole concept of a Python Dictionary. I haven't
    read anything as yet that gives a clear picture of what it is and what
    it is for. Please, classroom concepts usually consist of a handful of
    objects. I have files here that takes up multiple DVDs each, AFTER a 15
    to 1 compression. 3 bytes per pixel. I need to work with them. Things
    like changing geobase projections and cookie cutting based on real world
    coordinates and modifying the lumens and so forth. Based on what I've
    read, the Python Dictionary concept flat will not work for such as this.
    Yes - the example is overkill. But in my world it is reality. I deal
    with sizeable things. Not all are raster. Most all are binary! Things
    that work on massive text files - like banking and mortgage - simply
    don't work here. There are seldom 'lines'. There are always bytes. Lots
    of bytes. Things that form a group are not necessarily stored sequentially.

    Back to What Is A Python Dictionary: Somebody please enlighten me.


    Steve
    norseman@hughes .net
  • Bruno Desthuilliers

    #2
    Re: Multiple values for one key

    norseman a écrit :
    Terry Reedy wrote:
    >>
    >>
    >Ron Brennan wrote:
    >>Hello,
    >>>
    >>>
    >>How would I create a dictionary that contains multiple values for one
    >>key.
    >>
    >Make the value a collection object (set or list if you plan to add and
    >delete).
    >>
    >> I'd also like the key to be able to have duplicate entries.
    >>
    >Dict keys must be hashable and unique.
    >>
    >tjr
    >>
    >--
    >http://mail.python.org/mailman/listinfo/python-list
    >>
    =============== =
    First part I understand, second is still giving me a problem.
    >
    For some reason I still want keys to be dbf column headers.
    like:
    >
    name:address:zi p so forth
    ---- ------- --- ------------------
    guy: unknown:00000
    girl: 123 tiny street:12345
    boy:321 here:33333
    gal:999 over there: 55555
    so forth
    >
    Thus one key has many values. And you can then index on whatever key(s)
    you wish - name,zip...
    You can either use 1/ a list of dicts, or 2/ a dict mapping keys to lists.

    1/
    records = [
    {"name":"guy ", "address":"unkn own","zip":"000 00"},
    {"name":"gir l", "address":" 123 tiny street","zip":" 12345"},
    {"name":"boy ", "address":" 321 here","zip":"33 333"},
    {"name":"gal ", "address":" 999 over there","zip":"5 5555"},
    ]

    keys = ("name", "address", "zip")

    print ":".join(ke ys)
    print "-" * len(":".join(ke ys))
    for record in records:
    data = [record[key] for key in keys]
    print ":".join(da ta)


    2/
    records = dict(
    name=["guy", "girl", "boy", "gal"],
    address=["unknown"," 123 tiny street","321 there","999 over there"],
    zip=["00000", "12345", "33333", "55555"]
    )

    keys = ("name", "address", "zip")
    nb_records = len(records[keys[0]])

    print ":".join(ke ys)
    print "-" * len(":".join(ke ys))
    for i in xrange(nb_recor ds):
    data = [data[key][i] for key in keys]
    print ":".join(da ta)


    You are of course entitled the right to prefer the second solution, but
    then I hope I'll never have to maintain your code, since it's obviously
    not an appropriate data structure.
    With billions plus records,
    With billions plus records, it may be time to move to a serious RDBMS.
    Which btw will provide solution 1, or a lighter version of it using a
    list of tuples, ie:

    cursor = connection.curs or()
    cursor.execute( "select name, address, zip from peoples")
    records = cursor.fetchall ()

    # at this time, you have :
    #records = [
    # ("guy", "unknown","0000 0",),
    # ("girl", "123 tiny street","12345" ,),
    # ("boy", "321 here","33333",) ,
    # ("gal", "999 over there", "55555",),
    #]


    (snip)
    OK - I know I missed the whole concept of a Python Dictionary.
    Bad thing for you, since it's the central datastructure in Python.
    I haven't
    read anything as yet that gives a clear picture of what it is and what
    it is for.
    Then you failed to read the FineManual's tutorial, which is where you
    should have started:



    Do yourself a favour : read the above first, then if you still have
    questions about dicts, we'll gladly try to help.

    And do yourself another favour : learn about SQL, relational model and
    RDBMS.

    (snip description of why the OP *really* wants a RDBMS)

    Comment

    • Tim Rowe

      #3
      Re: Multiple values for one key

      2008/8/28 Bruno Desthuilliers <bruno.42.desth uilliers@websit eburo.invalid>:
      You can either use 1/ a list of dicts, or 2/ a dict mapping keys to lists.
      >
      1/
      records = [
      {"name":"guy ", "address":"unkn own","zip":"000 00"},
      {"name":"gir l", "address":" 123 tiny street","zip":" 12345"},
      {"name":"boy ", "address":" 321 here","zip":"33 333"},
      {"name":"gal ", "address":" 999 over there","zip":"5 5555"},
      ]
      I think I'd make a class with members name, address, zip, etc. Then
      make a list of instances of that class or (better for access) identify
      a primary key -- what *is* unique about each entry -- and use that as
      a dictionary key with class instances as values. Or use a DBMS.
      Certainly the original poster should read up on database design, or
      chances are he'll have a nightmare maintaining referential integrity.

      --
      Tim Rowe

      Comment

      Working...