如何检查Iterable中是否有任何奇数/偶数(例如列表/元组)?

时间:2017-05-30 07:25:54

标签: python

假设我们正在检查list中是否有任何奇数。最直接的方式是:

def has_odd(L):
    for v in L:
        if v % 2 == 1:
            return True
    return False

has_odd函数检查list中是否有奇数,一旦找到奇数,就返回True。但这看起来有点冗长。使用reduce的更简洁方法如下:

reduce(lambda res, v: res or bool(v), L, False)

但这将迭代所有元素并且是不必要的,因为一旦找到奇数,结果肯定是True

那么,有没有其他方法可以做到这一点?

3 个答案:

答案 0 :(得分:6)

您可以使用>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> any(n % 2 == 1 for n in l) True >>> 功能来减少详细程度:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

但是请注意any() is pretty much the same as you had originally just generalized,所以不要期望提高速度:

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 24828 (om.bdmaker.rtmp)

                                                    [ 05-30 13:28:30.710   395:  395 W/         ]
                                                    debuggerd: handling request: pid=24828 uid=10073 gid=10073 tid=24828

答案 1 :(得分:1)

首先让我们为“奇怪”写小指标函数,如

composer require spatie/laravel-backup

然后我们可以使用any / imap

使用map编写“至少包含一个奇数”的指标
  • Python 2。*

    def is_odd(number):
        return number % 2
    
  • Python 3。*

    from itertools import imap
    
    
    def has_odd_number(iterable):
        return any(imap(is_odd, iterable))
    

generator expression

def has_odd_number(iterable):
    return any(map(is_odd, iterable))

示例:

def has_odd_number(iterable):
    return any(is_odd(number) for number in iterable)

答案 2 :(得分:0)

另一种方式。你可以使用not all()

>>> l = [2, 4, 5, 6, 7, 8, 9, 10]
>>> not all(n%2==1 for n in l)
True