Python idiom to return first item or None

后端 未结 24 1717
清酒与你
清酒与你 2020-12-07 07:46

I\'m sure there\'s a simpler way of doing this that\'s just not occurring to me.

I\'m calling a bunch of methods that return a list. The list may be empty. If the

相关标签:
24条回答
  • 2020-12-07 08:09

    You could use Extract Method. In other words extract that code into a method which you'd then call.

    I wouldn't try to compress it much more, the one liners seem harder to read than the verbose version. And if you use Extract Method, it's a one liner ;)

    0 讨论(0)
  • 2020-12-07 08:09

    isn't the idiomatic python equivalent to C-style ternary operators

    cond and true_expr or false_expr
    

    ie.

    list = get_list()
    return list and list[0] or None
    
    0 讨论(0)
  • 2020-12-07 08:11
    if mylist != []:
    
           print(mylist[0])
    
       else:
    
           print(None)
    
    0 讨论(0)
  • 2020-12-07 08:12

    If you find yourself trying to pluck the first thing (or None) from a list comprehension you can switch to a generator to do it like:

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

    Pro: works if blah isn't indexable Con: it's unfamiliar syntax. It's useful while hacking around and filtering stuff in ipython though.

    0 讨论(0)
  • 2020-12-07 08:12

    Regarding idioms, there is an itertools recipe called nth.

    From itertools recipes:

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

    If you want one-liners, consider installing a library that implements this recipe for you, e.g. more_itertools:

    import more_itertools as mit
    
    mit.nth([3, 2, 1], 0)
    # 3
    
    mit.nth([], 0)                                             # default is `None`
    # None
    

    Another tool is available that only returns the first item, called more_itertools.first.

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

    These itertools scale generically for any iterable, not only for lists.

    0 讨论(0)
  • 2020-12-07 08:13

    Frankly speaking, I do not think there is a better idiom: your is clear and terse - no need for anything "better". Maybe, but this is really a matter of taste, you could change if len(list) > 0: with if list: - an empty list will always evaluate to False.

    On a related note, Python is not Perl (no pun intended!), you do not have to get the coolest code possible.
    Actually, the worst code I have seen in Python, was also very cool :-) and completely unmaintainable.

    By the way, most of the solution I have seen here do not take into consideration when list[0] evaluates to False (e.g. empty string, or zero) - in this case, they all return None and not the correct element.

    0 讨论(0)
提交回复
热议问题