first non-null element in a list, otherwise None

Peter Otten __peter__ at web.de
Thu Sep 2 15:57:59 CEST 2010


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



More information about the Python-list mailing list