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