Is there a list comprehension for this?

Steven D'Aprano steve at REMOVE.THIS.cybersource.com.au
Wed Nov 22 11:18:00 CET 2006


On Tue, 21 Nov 2006 21:00:02 -0800, John Machin wrote:

> Steven D'Aprano wrote:
> 
> [snip]
> 
>> def running_sum(dw):
>>     """Return a list of the running sums of sequence dw"""
>>     rs = [0]*len(dw)
>>     for i in range(len(dw)):
>>         rs[i] = dw[i] + rs[i-1]
> 
> Please explain to the newbies why there is no exception raised when
> rs[i-1] is executed for i == 0, and state whether you consider this is
> a Good Idea or a Filthy Trick or a Fortunate Accident.

Because rs[0-1] is just rs[-1], which fetches the LAST item of the list. I
cunningly initialised the list to all zeroes, so adding zero to the first
term doesn't change the result value.

It is a variation of the sentinel technique, where you add an extra value
to the beginning or end of a list so that you don't need to treat the
first or last item differently. In this specific case, I think it is a
combination of Good Idea and Fortunate Accident, but since the
meaning of list[-1] is both deliberate and well-documented, it is
certainly not a Filthy Trick. 


-- 
Steven.




More information about the Python-list mailing list