我调用了一堆返回列表的方法。列表可能是空的。如果列表非空,我想返回第一项;否则,我想返回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
但是,在我看来,应该有一个简单的一行习语来做这件事。是吗?
当前回答
下面的代码涵盖了使用lambda的几个场景:
l1 = [1,2,3]
l2 = []
l3 = None
first_elem = lambda x: x[0] if x else None
print(first_elem(l1))
print(first_elem(l2))
print(first_elem(l3))
其他回答
你可以使用提取方法。换句话说,将代码提取到一个方法中,然后调用该方法。
我不会试图进一步压缩它,一行代码似乎比冗长的版本更难阅读。如果你使用提取方法,它是一行;)
(get_list() or [None])[0]
这应该有用。
顺便说一句,我没有使用变量列表,因为那会覆盖内置列表()函数。
编辑:我之前有一个稍微简单,但错误的版本。
我的用例只是设置一个局部变量的值。
就我个人而言,我发现try and except风格更容易阅读
items = [10, 20]
try: first_item = items[0]
except IndexError: first_item = None
print first_item
而不是切片列表。
items = [10, 20]
first_item = (items[:1] or [None, ])[0]
print first_item
不确定这是如何python化的,但在库中有第一个函数之前,我将其包含在源代码中:
first = lambda l, default=None: next(iter(l or []), default)
它只有一行(符合黑色),避免了依赖关系。
if mylist != []:
print(mylist[0])
else:
print(None)