Simple db using list comprehensions

Paddy McCarthy paddy3118 at netscape.net
Thu Apr 15 23:29:29 EDT 2004


frank at chagford.com (Frank Millman) wrote in message news:<246a4e07.0404050626.153ff525 at posting.google.com>...
> Hi all
> 
> From time to time there is a request for a simple way of storing and
> accessing data without using a full SQL database.
> 
> I had this requirement recently, and I was pleasantly surprised by how
> much I could achieve with a simple Python list and list
> comprehensions.
> 
> Assume the need to store data consisting of first name, surname and
> phone number. To ensure uniqueness, I use an additional column to
> store a unique id, which can just be a 'next number'.
> 
> To create the table -
> 	table = []
> 
> To initialise it with a couple of rows -
> 	table.append([1,'Frank','Millman',12345])
> 	table.append([2,'John','Smith',54321])

I like the idea but think you should have a definition of something 
like - 
  INDEX,FIRSTNAME,SURNAME,PHONE = range(4)
You should use the names instead of all the 'magic' constants 
below when referring to fields in rows.

Cheers, Paddy.

> 
> To get the last id used -
> 	last_id = max([row[0] for row in table])
> 
> Alternatively, if you know the rows are in id sequence -
> 	last_id = table[-1][0]
> 
> To add a new row -
> 	firstname = 'Fred'
> 	surname = 'Jones'
> 	phone = 23456
> 
> First, ensure first name and surname are unique -
> 	rows = [row for row in table if row[1] == firstname and row[2] ==
> surname]
> 	if len(rows):
> 		errmsg = 'Already exists'
> 
> If ok, add the row -
> 	last_id += 1
> 	table.append([last_id,firstname,surname,phone])
> 
> To select all rows according to some criteria (eg surnames starting
> with 'M') -
> 	rows = [row for row in table if row[2][0] == 'M']
> 
> If you need a copy of the rows -
> 	rows = [row[:] for row in table if row[2][0] == 'M']
> 
> To sort the rows in surname sequence -
> 	rows = [[row[2],row] for row in rows]  # prepend surname to row for
> sorting
> 	rows.sort()
> 	rows = [row[1] for row in rows]  # remove prepended surname
> 
> To select and sort at the same time -
> 	rows = [[row[2],row] for row in table if row[2][0] == 'M']
> 	rows.sort()
> 	rows = [row[1] for row in rows]
> 
> To amend a phone number if you know the first name and surname -
> 	rows = [row for row in table if row[1] == 'Fred'  and row[2] ==
> 'Jones']
>       if not rows:
> 		errmsg = 'not found'
> 	elif len(rows) > 1:
> 		errmsg = 'more than one row found'
> 	else:
> 		rows[0][3] = phone
> 
> To delete a row if you know the first name and surname -
> 	rows = [row for row in table if row[1] == 'Fred'  and row[2] ==
> 'Jones']
>       if not rows:
> 		errmsg = 'not found'
> 	elif len(rows) > 1:
> 		errmsg = 'more than one row found'
> 	else:
> 		pos = [row[0] for row in table].index(rows[0][0])
> 		del table[pos]
> 
> To delete all rows with a phone number of 0 -
> 	ids = [row[0] for row in table]
> 	rows = [row[0] for row in table if row[3] == 0]
> 	for row in rows:
> 		pos = ids.index(row)
> 		del table[pos]
> 		del ids[pos]
> 
> I have not tested all of these, but you get the idea.
> 
> I did not have to save the data, but if you need to, I am sure you can
> pickle it.
> 
> Hope this is of interest.
> 
> Frank Millman



More information about the Python-list mailing list