我调用了一堆返回列表的方法。列表可能是空的。如果列表非空,我想返回第一项;否则,我想返回None。这段代码工作:
def main():
my_list = get_list()
if len(my_list) > 0:
return my_list[0]
return None
但是,在我看来,应该有一个简单的一行习语来做这件事。是吗?
我调用了一堆返回列表的方法。列表可能是空的。如果列表非空,我想返回第一项;否则,我想返回None。这段代码工作:
def main():
my_list = get_list()
if len(my_list) > 0:
return my_list[0]
return None
但是,在我看来,应该有一个简单的一行习语来做这件事。是吗?
当前回答
可能不是最快的解决方案,但没有人提到这个选项:
dict(enumerate(get_list())).get(0)
如果get_list()可以返回None,你可以使用:
dict(enumerate(get_list() or [])).get(0)
优点:
一线
-你只需要调用get_list()一次
-容易理解
其他回答
这个怎么样:
(my_list and my_list[0])或None
注意:这应该适用于对象列表,但它可能会返回错误的答案,在数字或字符串列表的情况下,每个下面的注释。
最好的方法是:
a = get_list()
return a[0] if a else None
你也可以在一行中完成,但这对程序员来说很难读懂:
return (get_list()[:1] or [None])[0]
使用and-or技巧:
a = get_list()
return a and a[0] or None
def head(iterable):
try:
return iter(iterable).next()
except StopIteration:
return None
print head(xrange(42, 1000) # 42
print head([]) # None
顺便说一句:我会把你的一般程序流程重做成这样:
lists = [
["first", "list"],
["second", "list"],
["third", "list"]
]
def do_something(element):
if not element:
return
else:
# do something
pass
for li in lists:
do_something(head(li))
(尽可能避免重复)
你可以使用提取方法。换句话说,将代码提取到一个方法中,然后调用该方法。
我不会试图进一步压缩它,一行代码似乎比冗长的版本更难阅读。如果你使用提取方法,它是一行;)