[falcon] > I am fairly new to Python (less than a week). My goal is to write a > small prototype of a database. Rather than build it using the typical > method where one provides selection, projection, aggregation, union, > intersection, etc. functions, I would like to do it in a more > 'functional' style (executing a database query by using map, reduce, > filter, etc. I am curious what the best way is to work with a list of > tuples. For example, if I have the following list: > [('a',1),('a',1),('a',3),('b',1),('b',2),('c',2),('c',3),('c',4)] > how do I apply a map to each item in each tuple in the list? What if I > want to filter based on both elements (the number AND the letter)? > > The most obvious solution is just to provide a function or a lambda > expression whcih does what I want. However, since this is, eventually, > going to be a database, the user will decide at run time what functions > and operations should be run on a 'table' (really a list of tuples) ... > and the structure of the 'table' will obviously not be known until > run-time. > > I didn't find any examples of using idioms from functional programming > beyond basic explanation of reduce and map (I have a couple of Haskell > and ML books, but I know those languages even less than Python). > > I hope you understand the problem. Thanks in advance.
This is a somewhat advanced problem for your first week in Python. Essentially, what you need to do is write parameterized helper functions to pass to map(), filter(), and reduce(). First, look at a non-parameterized example. Given a record, append a new field that is the sum of fields 1 and 3: def z(record): sum = record[1] + record[3] return record + (sum,) Apply it to the database with: result = map(z, database) Now, make a parameterized version that allows the user specified fields and operations: def pfunc(inputfields, operation): def z(record): newfield = operation(*[record[f] for f in inputfields]) return record + (newfield,) return z z = pfunc((1, 3), operator.add) # parameters specified by the user at runtime result = map(z, database) Parameterized filter, extract, and reduce functions can be handled in a like manner. Raymond -- http://mail.python.org/mailman/listinfo/python-list