Sybren Stuvel wrote:

> Paul Rubin enlightened us with:
>>> height = 0
>>> for block in stack:
>>>     if block.is_marked():
>>>         print "Lowest marked block is at height", height
>>>         break
>>>     height += block.height
>>> else:
>>>     raise SomeError("No marked block")
>>
>>     all_heights = [block.height for block in stack if block.is_marked()]
>>     if all_heights:
>>       height = sum(all_heights)
>>     else:
>>       raise SomeError("No marked block")
>>
>> Alternatively (lower memory usage for large list):
>>
>>     all_heights = (block.height for block in stack if block.is_marked())
>>     try:
>>       height = all_heights.next()
>>       height += sum(all_heights)
>>     except StopIteration:
>>       raise SomeError("No marked block")
> 
> I must say that the for/else construct is a LOT more readable than the
> rewritten alternatives.

I like

def blocks_til_mark(stack):
    for block in stack:
        if block.is_marked():
            return
        yield block
    raise SomeError
height = sum(block.height for block in blocks_til_mark(stack))

Peter
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to