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

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

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


当前回答

if mylist != []:

       print(mylist[0])

   else:

       print(None)

其他回答

def head(iterable):
    try:
        return iter(iterable).next()
    except StopIteration:
        return None

print head(xrange(42, 1000)  # 42
print head([])               # None

顺便说一句:我会把你的一般程序流程重做成这样:

lists = [
    ["first", "list"],
    ["second", "list"],
    ["third", "list"]
]

def do_something(element):
    if not element:
        return
    else:
        # do something
        pass

for li in lists:
    do_something(head(li))

(尽可能避免重复)

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)

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

cond and true_expr or false_expr

ie.

list = get_list()
return list and list[0] or 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一般适用于任何可迭代对象,而不仅仅适用于列表。

你可以使用提取方法。换句话说,将代码提取到一个方法中,然后调用该方法。

我不会试图进一步压缩它,一行代码似乎比冗长的版本更难阅读。如果你使用提取方法,它是一行;)