On Sep 2, 2:48 pm, wheres pythonmonks <wherespythonmo...@gmail.com> wrote: > This should be trivial: > > 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. > > 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? > > More importantly, > > Is there a better way? (In one line?) > > Thanks, > > W
Just for fun: >>> print min([None, 2, None, None, 1], key=lambda x: x is None) 2 >>> print min([None, None, None], key=lambda x: x is None) None Looks clever but: min([], key=lambda x: x is None) throws an exception. -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list