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

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

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


当前回答

Python 2 + 6。

next(iter(your_list), None)

如果your_list可以为None:

next(iter(your_list or []), None)

Python 2.4

def get_first(iterable, default=None):
    if iterable:
        for item in iterable:
            return item
    return default

例子:

x = get_first(get_first_list())
if x:
    ...
y = get_first(get_second_list())
if y:
    ...

另一个选择是内联上面的函数:

for x in get_first_list() or []:
    # process x
    break # process at most one item
for y in get_second_list() or []:
    # process y
    break

为了避免中断,你可以这样写:

for x in yield_first(get_first_list()):
    x # process x
for y in yield_first(get_second_list()):
    y # process y

地点:

def yield_first(iterable):
    for item in iterable or []:
        yield item
        return

其他回答

try:
    return a[0]
except IndexError:
    return None

最好的方法是:

a = get_list()
return a[0] if a else None

你也可以在一行中完成,但这对程序员来说很难读懂:

return (get_list()[:1] or [None])[0]

my_list[0] if len(my_list) else无

关于习语,有一个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一般适用于任何可迭代对象,而不仅仅适用于列表。

可能不是最快的解决方案,但没有人提到这个选项:

dict(enumerate(get_list())).get(0)

如果get_list()可以返回None,你可以使用:

dict(enumerate(get_list() or [])).get(0)

优点:

一线

-你只需要调用get_list()一次

-容易理解