first non-null element in a list, otherwise None

Arnaud Delobelle arnodel at googlemail.com
Thu Sep 2 17:01:34 CEST 2010


On Sep 2, 2:48 pm, wheres pythonmonks <wherespythonmo... at 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



More information about the Python-list mailing list