我调用了一堆返回列表的方法。列表可能是空的。如果列表非空,我想返回第一项;否则,我想返回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
但是,在我看来,应该有一个简单的一行习语来做这件事。是吗?
当前回答
不是python中等价于c风格的三元运算符
cond and true_expr or false_expr
ie.
list = get_list()
return list and list[0] or None
其他回答
more_itertools借款。First_true代码产生一些可读的东西:
def first_true(iterable, default=None, pred=None):
return next(filter(pred, iterable), default)
def get_first_non_default(items_list, default=None):
return first_true(items_list, default, pred=lambda x: x!=default)
(get_list() or [None])[0]
这应该有用。
顺便说一句,我没有使用变量列表,因为那会覆盖内置列表()函数。
编辑:我之前有一个稍微简单,但错误的版本。
OP的解决方案已经差不多了,只是有几件事让它更python化。
首先,不需要知道列表的长度。Python中的空列表在if检查中求值为False。只要简单地说
if list:
此外,赋值给与保留字重叠的变量是一个非常糟糕的主意。list是Python中的保留字。
我们把它改成
some_list = get_list()
if some_list:
这里很多解决方案忽略的一个非常重要的一点是,所有Python函数/方法默认返回None。试试下面的方法。
def does_nothing():
pass
foo = does_nothing()
print foo
除非你需要返回None来提前终止一个函数,否则没有必要显式地返回None。非常简洁,只要返回第一个条目,如果它存在的话。
some_list = get_list()
if some_list:
return list[0]
最后,也许这是隐含的,但只是显式的(因为显式比隐式好),你不应该让你的函数从另一个函数获取列表;把它作为参数传入。最后的结果是
def get_first_item(some_list):
if some_list:
return list[0]
my_list = get_list()
first_item = get_first_item(my_list)
正如我所说的,OP几乎已经完成了,只需稍加修改就可以获得您正在寻找的Python风格。
使用and-or技巧:
a = get_list()
return a and a[0] or None
最python惯用的方法是在迭代器上使用next(),因为list是可迭代的。就像@J.F。塞巴斯蒂安在2011年12月13日发表了这条评论。
next(iter(the_list), None)如果the_list为空返回None。参见next() Python 2.6+
或者如果你确定the_list不是空的:
iter(the_list).next()参见iterator.next(