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])
Cloud computing provides the capability to use computing and storage resources on a metered basis and reduce the investments in an organization’s computing infrastructure. The spawning and deletion ...
Data and storage models are the basis for big data ecosystem stacks. While storage model captures the physical aspects and features for data storage, data model captures the logical representation and...
Roger Jennings is an author and consultant specializing in Microsoft .NET n-tier database applications and data-intensive Windows Communication Foundation (WCF) Web services with SQL Server. He’s be...
I have developed this book to investigate Mesos-based cluster development and integration. I found that data center operating system (DCOS; and it’s command-line interface [CLI]) was a natural progr...