检查元组中是否存在数字的模数

时间:2015-02-18 06:14:41

标签: python

我正在尝试检查一个数字模数的模数,如果模数等于元组中我想要返回的其中一个值,则返回True。

这是我到目前为止所尝试过的:

def check(y):
    k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
    for i in range(0, len(k)):
        if k[i] == y % 30:
            return True
        else:
            return False


def main():
    print(check(1439))

main()

它总是返回false。

3 个答案:

答案 0 :(得分:3)

这总是返回false,因为只检查了第一项。如果第一项是匹配,那么它将返回true。例如,如果y为32,则返回true。检查所有值后,即在for循环之外,您需要返回false。或者更好的解决方案是使用in运算符。

def check(y):
    k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
    return y % 30 in k

答案 1 :(得分:2)

它总是返回false,因为这段代码:

for i in range(0, len(k)):
    if k[i] == y % 30:
        return True
    else:
        return False

仅基于数组中的 first 项返回true或false,因为它返回两个可能的代码路径。 k[0] == y % 30,它返回true,或k[0] != y % 30,它返回false。

如果你想使用这个基于循环的解决方案,你需要检查数组中的每个项,如果匹配则立即返回true,否则返回false only 列表已经用尽了,类似于(使用循环的for n in k变体,因为索引在这里无关紧要):

for n in k:
    if n == y % 30:
        return True
return False

完整的计划是:

def check(y):
    k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
    for n in k:
        if n == y % 30:
            return True
    return False

def main():
    print(check(1439))
    print(check(36))

main()

第一个调用生成为1439 % 30 == 29(在列表中),但第二个调用为false,因为36 % 30 == 6(不在列表中)。

当然,实现这一目标还有更多的Pythonic方式:

def check(y):
    k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
    return any (x == y % 30 for x in k)

基本上找到k中该元素等于y % 30的任何元素。有关Python any操作的更多信息,请参阅this link,您会立即看到给出的等效代码与您的循环非常相似:

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

但是,当然,事实证明在这种特殊情况下没有必要使用any,因为y % 30实际上是一个固定的值,在搜索名单。相反,您可以选择更简单的方法:

def check(y):
    k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
    return (y % 30) in k

离开any变体进行更复杂的比较并不容易,例如只检查列表中的偶数:

def check(y):
    k = (2, 5, 8, 10, 13, 16, 19, 21, 24, 27, 29)
    return any (x == y % 30 for x in k if x % 2 == 0)

答案 2 :(得分:1)

您可以使用any()中的生成器表达式完成此操作:

def check(y):
  return any(n == y % 30 for n in k)

这构建了一个布尔迭代器,对于除y的除数的k的所有元素都是正确的。