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

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

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


当前回答

使用and-or技巧:

a = get_list()
return a and a[0] or 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))

(尽可能避免重复)

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

这应该有用。

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

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

my_list[0] if len(my_list) else无

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

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

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

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

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