[Tutor] detecting a change in a iterable object (list, array, etc.)

Kent Johnson kent37 at tds.net
Tue Nov 27 02:33:56 CET 2007


Tim Michelsen wrote:
> Hello,
> would like to ask for your help on the following issue:
> What procedure can I use to detect if there's a change when iterating 
> over a list?
> 
> For instance if I want to extract the years 1997 and 1998 from the table 
> below and save them into separate files?

A list comprehension will work for this. If data is a list of triples of 
(year, month, volume) then this will give you a list of the 1997 triples:

data1997 = [ item for item in data if item[0]==1997 ]

> How do I build the average only on the 1997-year values?

Given the above data1997 list can you do this? Sum the third values and 
divide by the length of the list.

> Or how do find out that there is three successive values 3*2 and 3*2 in 
> the volume column?

itertools.groupby() is helpful for this. It's a bit tricky to understand 
though. Here is an extended example:
http://personalpages.tds.net/~kent37/blog/arch_m1_2005_12.html#e69

Here is an example that shows sequences of values of length 3 or more:

import itertools
def key(item):
     return item[2]

for k, g in itertools.groupby(data, key=key):
     g = list(g)
     if len(g) > 2:
         print k, 'occurs', len(g), 'times'

> 
> I already tried a for-loop in connection with a last_value == current 
> value comparison but wasn't successful at all.

If you show us what you have done so far it would be easier to make
suggestions.

Kent


More information about the Tutor mailing list