Multiple values for one key

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Thu Aug 28 11:56:34 EDT 2008


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:zip 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":"unknown","zip":"00000"},
    {"name":"girl", "address":"123 tiny street","zip":"12345"},
    {"name":"boy", "address":"321 here","zip":"33333"},
    {"name":"gal", "address":"999 over there","zip":"55555"},
]

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

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


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(keys)
print "-" * len(":".join(keys))
for i in xrange(nb_records):
     data = [data[key][i] for key in keys]
     print ":".join(data)


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.cursor()
cursor.execute("select name, address, zip from peoples")
records = cursor.fetchall()

# at this time, you have :
#records = [
#   ("guy", "unknown","00000",),
#   ("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:

http://docs.python.org/tut/node7.html#SECTION007500000000000000000

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)



More information about the Python-list mailing list