wheres pythonmonks wrote: > I am looking to extract the first non-None element in a list, and > "None" otherwise. Here's one implementation: > >>>> x = reduce(lambda x,y: x or y, [None,None,1,None,2,None], None) >>>> print x > 1 > > I thought maybe a generator expression would be better, to prevent > iterating over the whole list: > >>>> x = ( x for x in [None,1,2] if x is not None ).next() >>>> print x > 1 > > However, the generator expression throws if the list is entirely None.
The next() builtin (new in Python 2.6) allows you to provide a default: >>> next((item for item in [None, None, "found"] if item is not None), "no match") 'found' >>> next((item for item in [None, None, None] if item is not None), "no match") 'no match' > With list comprehensions, a solution is: > >>>> x = ([ x for x in [None,1,2] if x is not None ] + [ None ] )[0] > > But this can be expensive memory wise. Is there a way to concatenate > generator expressions? itertools.chain() Peter -- http://mail.python.org/mailman/listinfo/python-list