Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Populating a Python dictionary

Hi I'm building a dictionary where each key is a customer name and each value is a list of tuples which are purchased by each customer, like so: (product, quantity). For example:

{'customer1': (('milk', 3), ('bread', 5), ('eggs', 2)),
 'customer2': (('cheese', 2), ('cereal', 7))}

I am populating the dictionary based on the results of a SQL query. Being a Java programmer new to Python, can someone suggest the "pythonic" way to do this? Each row from the query contains customer name, product, quantity.

like image 957
JCB Avatar asked May 15 '12 13:05

JCB


3 Answers

First of all, I'd use lists rather than tuples as dictionary entries. The principal difference is that lists are mutable, whereas tuples are not.

I think defaultdict is a good for for this problem:

from collections import defaultdict

customers = defaultdict(list)

You can add entries like so (of course in your case you'd do this in a loop):

customers['customer1'].append(('milk', 3))
customers['customer1'].append(('bread', 5))
customers['customer2'].append(('cereal', 7))

The result is:

>>> print dict(customers)
{'customer1': [('milk', 3), ('bread', 5)], 'customer2': [('cereal', 7)]}
like image 112
NPE Avatar answered Oct 31 '22 19:10

NPE


Your inner structure should be a list, not a tuple, since the structure is homogenous.

{'customer1': [('milk', 3), ('bread', 5), ('eggs', 2)],
 'customer2': [('cheese', 2), ('cereal', 7)]}

This will also allow you to use .append() on them, and you can use collections.defaultdict to start off each value with an empty list for further simplification.

like image 21
Ignacio Vazquez-Abrams Avatar answered Oct 31 '22 20:10

Ignacio Vazquez-Abrams


Im hoping that you have a list of lists from your database, so e.g.

rows = [('customer1', ('milk', 2)), ('customer12', ('bread', 4))] # etc etc

Then you can simply do.

for row in rows:
    cust_dict[row[0]] = row[1:]
like image 35
Jakob Bowyer Avatar answered Oct 31 '22 20:10

Jakob Bowyer