Python列表怎样返回第一个元素或None

问题:

我相信有一个更简单的做法,只是没有发生在我身上。
我正在调用一堆返回列表的方法。列表可能为空。如果列表不为空,我想返回第一个项目;否则,我想返回None。此代码工作原理:

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

在我看来,应该有一个简单的单行成语,但对于我来说,我无法想像。在那儿?
编辑:
我在这里寻找一行表达式的原因不在于我喜欢令人难以置信的简洁的代码,而是因为我不得不编写很多代码:

x = get_first_list()
if x:
    # do something with x[0]
    # inevitably forget the [0] part, and have a bug to fix
y = get_second_list()
if y:
    # do something with y[0]
    # inevitably forget the [0] part AGAIN, and have another bug to fix

我想做的,当然可以用一个函数来完成(也许会是)

def first_item(list_or_none):
    if list_or_none: return list_or_none[0]

x = first_item(get_first_list())
if x:
    # do something with x
y = first_item(get_second_list())
if y:
    # do something with y

我发布了这个问题,因为我经常对Python中的简单表达式感到惊讶,我认为如果有一个简单的表达式可以做到这一点,我写一个函数是一个愚蠢的事情。但是看到这些答案,似乎是一个函数is简单的解决方案。

回答:

Python 2.6+

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

为了避免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

Code问答: http://codewenda.com/topics/python/
Stackoverflow: Python idiom to return first item or None

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

96 − 95 =