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 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?
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 # inevitably forget the  part, and have a bug to fix y = get_second_list() if y: # do something with y # inevitably forget the  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 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.
your_list can be
next(iter(your_list or ), None)
def get_first(iterable, default=None): if iterable: for item in iterable: return item return default
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
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
def yield_first(iterable): for item in iterable or : yield item return
The best way is this:
a = get_list() return a 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])