Python idiom to return first item or None

StackOverflow

I"m sure there"s a simpler way of doing this that"s just not occurring to me.

I"m calling a bunch of methods that return a list. The list may be empty. If the list is non-empty, I want to return the first item; otherwise, I want to return None. This code works:

my_list = get_list()
if len(my_list) > 0: return my_list[0]
return None

It seems to me that there should be a simple one-line idiom for doing this, but for the life of me I can"t think of it. Is there?

Edit:

The reason that I"m looking for a one-line expression here is not that I like incredibly terse code, but because I"m having to write a lot of code like this:

x = get_first_list()
if x:
    # do something with x[0]
    # inevitably forget the [0] part, and have a bug to fix
y = get_second_list()
if y:
    # do something with y[0]
    # inevitably forget the [0] part AGAIN, and have another bug to fix

What I"d like to be doing can certainly be accomplished with a function (and probably will be):

def first_item(list_or_none):
    if list_or_none: return list_or_none[0]

x = first_item(get_first_list())
if x:
    # do something with x
y = first_item(get_second_list())
if y:
    # do something with y

I posted the question because I"m frequently surprised by what simple expressions in Python can do, and I thought that writing a function was a silly thing to do if there was a simple expression could do the trick. But seeing these answers, it seems like a function is the simple solution.

Answer rating: 265




Python 2.6+

next(iter(your_list), None)

If your_list can be None:

next(iter(your_list or []), None)



Python 2.4

def get_first(iterable, default=None):
    if iterable:
        for item in iterable:
            return item
    return default

Example:

x = get_first(get_first_list())
if x:
    ...
y = get_first(get_second_list())
if y:
    ...

Another option is to inline the above function:

for x in get_first_list() or []:
    # process x
    break # process at most one item
for y in get_second_list() or []:
    # process y
    break

To avoid break you could write:

for x in yield_first(get_first_list()):
    x # process x
for y in yield_first(get_second_list()):
    y # process y

Where:

def yield_first(iterable):
    for item in iterable or []:
        yield item
        return

Answer rating: 239

The best way is this:

a = get_list()
return a[0] if a else None

You could also do it in one line, but it"s much harder for the programmer to read:

return (get_list()[:1] or [None])[0]




Get Solution for free from DataCamp guru