如何检查可迭代对象中是否有任何奇数/偶数(例如列表/元组)?



假设我们正在检查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

那么,还有其他方法可以做吗?

您可以使用any()函数来减少冗长:

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

注意,any()与您最初刚刚概括几乎相同,因此不要指望提高速度:

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

首先,让我们写出小的指示器函数,以称为

def is_odd(number):
    return number % 2

然后,我们可以使用imap/map

使用any编写"至少有一个奇数"的指标
  • python 2。*

    from itertools import imap
    
    def has_odd_number(iterable):
        return any(imap(is_odd, iterable))
    
  • python 3。*

    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)

示例:

>>> has_odd_number([0])
False
>>> has_odd_number([1])
True

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

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

最新更新