我调用了一堆返回列表的方法。列表可能是空的。如果列表非空,我想返回第一项;否则,我想返回None。这段代码工作:

def main():
    my_list = get_list()
    if len(my_list) > 0:
        return my_list[0]
    return None

但是,在我看来,应该有一个简单的一行习语来做这件事。是吗?


当前回答

不确定这是如何python化的,但在库中有第一个函数之前,我将其包含在源代码中:

first = lambda l, default=None: next(iter(l or []), default)

它只有一行(符合黑色),避免了依赖关系。

其他回答

最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(

坦率地说,我认为没有更好的成语了:your is clear and short -不需要什么“更好的”。也许吧,但这真的是一个品味的问题,你可以改变if len(list) > 0:与if list: -一个空列表将永远求值为False。

在相关的说明中,Python不是Perl(没有双关的意思!),您不必获得尽可能最酷的代码。 实际上,我在Python中见过的最糟糕的代码,也是非常酷的:-),而且完全无法维护。

顺便说一下,我在这里看到的大多数解决方案都不考虑list[0]计算为False(例如空字符串或零)-在这种情况下,它们都返回None而不是正确的元素。

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风格。

my_list[0] if len(my_list) else无

一些人建议这样做:

list = get_list()
return list and list[0] or None

这在许多情况下都有效,但它只在列表[0]不等于0、False或空字符串时才有效。如果列表[0]为0、False或空字符串,该方法将错误地返回None。

我在自己的代码中创建了这个错误太多次了!