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

5

假设我们要检查一个 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

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


4
any(int(digit) % 2 for digit in str(number)) 的意思是在一个数字的每一位上,将其转换成字符串,然后逐一判断是否为奇数。如果至少有一位是奇数,则返回 True;否则返回 False。 - Łukasz Rogalski
显然,如果L是一个序列,正确的形式应该是any(number % 2 for number in sequence)。我不知何故误读了一个问题,认为您正在检查列表中数字的位数。 - Łukasz Rogalski
3个回答

6

2
这可以简化为 any(n % 2 for n in l) 或者 any(n & 1 for n in l),但我猜你的版本更易读。 - PM 2Ring
@PM2Ring 是的,你说得对。我知道我可以把它进一步简化。但是,就像你说的那样,我认为我发布的版本更易读。而且这并不会带来太大的代价。 - Christian Dean
我有一个小问题:在表达式 any(n % 2 == 1 for n in l) 中,n % 2 == 1 for n in l 是一个生成器吗?难道不应该是 any((n % 2 == 1 for n in l)) 吗? - Charles Dong
@CharlesDong 你是对的。它是一个生成器。它不需要括号的原因是它是 any() 的唯一参数。如果 any() 接受更多的参数,那么表达式就需要括号。这里是文档中的说明:_"在只有一个参数的调用中,可以省略括号。详见“调用”章节。"_ - Christian Dean

1

首先,让我们编写一个小的指示函数来判断奇偶性,例如:

def is_odd(number):
    return number % 2

然后我们可以使用 anyimap/map 编写“至少有一个奇数”指标。

  • 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

0

另一种方法是使用not all()

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接