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