【问题标题】:Is there a function in python that returns true if all members of an iterable are true?如果可迭代的所有成员都为真,python中是否有一个函数返回真?
【发布时间】:2013-09-12 11:10:34
【问题描述】:

我正在尝试学习在 python 中做简单事情的不同方法,同时也学习一些功能实践。我有一些用户输入的数字,我想知道它们是否真的是数字。我想出了这种经典的解决方案:

def foo(list_of_inputs):
    for n in list_of_inputs:
       if not hasattr(n, "real"):
           # some number is not a number!
           return False
    # all are numbers
    return True

但后来,我想出了另一个可能有潜力的“东西”:

def foo(list_of_inputs):
    bool_list = map(lambda input: hasattr(input, "real"), list_of_inputs)
    return reduce(lambda x, y: x == y, bool_list)

我认为,如果集合、可迭代或任何我正在寻找的正确概念的所有成员都是“True”,则可能返回“True”的函数可能已经有些普遍,而且,这当找到“False”时,第二次尝试不会返回,而经典的尝试会......但我觉得它很优雅,也许那是因为我还没有一般的编程。

所以我的问题是:“可能更好”的方法是什么?

【问题讨论】:

  • 您通常会将all 与生成器表达式一起使用:all(hasattr(input, 'real') for input in list_of_inputs)
  • 这实际上是迄今为止我见过的最好的方式,即使否定了我认为我会找到它的地方(在一些与功能相关的实践之后)。谢谢

标签: python lambda reduce hasattr


【解决方案1】:

如前所述,all 函数可以满足您的需求。你描述你想要做的也可以用str.isnumeric()函数来完成。

def foo(listOfInputs):
    return all(map(str.isnumeric,listOfInputs))

编辑:我发现它在['1','2','3.14','4'] 上失败了,这有点烦人。也许有人能想出比这更聪明的解决方案,但我决定在try 中包含一个稍微修改的方法:

def foo(listOfInputs):
    try:
        return all(map(float,listOfInputs))
    except ValueError:
        return False

适用于:

['1','2','-3','4']
['1','2','3.14','4']

【讨论】:

  • 很高兴知道 isnumeric(),它不起作用,但似乎是因为我在 python 2.7.5 上,它必须是 unicode。非常感谢。也许我应该忘记尝试避免测试所有不必要的东西,至少现在是这样。
  • 我的错。测试用户输入是一种很好的做法,但您可以轻松地“深入兔子洞”检查用户可能输入的任何内容。示例:如果有人输入1,000,000 怎么办?还是1,199.99?或者如果他们在欧洲并且输入1.000.000,99 怎么办?从理论上讲,这些都应该是有效的,但是编写代码来测试所有这些可能会成为一个完整的regex 事情。
  • 是的,但是,嘿,有一些语法约束,所以处理这些边缘情况的最佳方法可能是告知输入的预期方式。我实际上来自欧洲,所以我知道你提到的例子可能是个问题。
  • 您不需要foo 中的lamba。 return all(map(str.isnumeric, listOfInputs))
  • 这真的很酷,谢谢你的提示。我已经更新了答案以反映这一点。
【解决方案2】:

你的意思是像内置的 all 函数?

如果可迭代对象的所有元素都为真(或可迭代对象为空),则返回 True。相当于:

【讨论】:

  • 是的,all(map(lambda x: hasattr(x, "real"), list_of_inputs)) 看起来更好,谢谢!我应该更频繁地检查 bultins...但是仍然存在检查所有而不是在任何为“假”时返回的问题。不过还是谢谢
  • @ferhtgoldaraz (map(lambda x: hasattr(x, "real"), list_of_inputs)) 看起来比短而甜美的all 更好看?
  • 不,只是我需要构建布尔值的集合,并在其上调用 all()...不是吗?
猜你喜欢
  • 2022-11-25
  • 2016-05-03
  • 2012-10-12
  • 2021-10-15
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多