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

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

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


当前回答

my_list[0] if len(my_list) else无

其他回答

这个怎么样:

(my_list and my_list[0])或None

注意:这应该适用于对象列表,但它可能会返回错误的答案,在数字或字符串列表的情况下,每个下面的注释。

关于习语,有一个itertools食谱叫做nth。

来自itertools食谱:

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(islice(iterable, n, None), default)

如果你想要一行程序,可以考虑安装一个库来实现这个recipe,例如more_itertools:

import more_itertools as mit

mit.nth([3, 2, 1], 0)
# 3

mit.nth([], 0)                                             # default is `None`
# None

还有另一个只返回第一项的工具,叫做more_itertools.first。

mit.first([3, 2, 1])
# 3

mit.first([], default=None)
# None

这些itertools一般适用于任何可迭代对象,而不仅仅适用于列表。

(get_list() or [None])[0]

这应该有用。

顺便说一句,我没有使用变量列表,因为那会覆盖内置列表()函数。

编辑:我之前有一个稍微简单,但错误的版本。

如果你发现自己试图从列表理解中提取第一件事(或None),你可以切换到生成器来这样做:

next((x for x in blah if cond), None)

正方:如果blah是不可索引的,它是有效的,反面:它是不熟悉的语法。不过,当在ipython中破解和过滤东西时,它很有用。

不是python中等价于c风格的三元运算符

cond and true_expr or false_expr

ie.

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