【问题标题】:Python for loop returns True after first itemPython for 循环在第一项后返回 True
【发布时间】:2018-06-10 23:11:34
【问题描述】:
def checker(a_list):
    for item in a_list:
        if str(item).isdigit():
            return True
        else:
            return False

检查器的变量是包含变量的四个字符串的列表。 我打算将它用作“检查器”,以查看另一个函数的所有输入值是否仅包含数字。

问题:如果 a_list 中的第一项不是数字,则检查器应返回 False。但是,如果第一项是数字而列表中的其他任何一项都不是,则 checker 无论如何都会返回 True。这会导致下一个函数继续处理非数字变量并导致错误。

如何让我的函数在返回 True 之前检查整个列表? 或者,如果需要,我如何创建一个新功能来满足我的需求? 谢谢

【问题讨论】:

  • 你想检查列表的所有成员为数字吗?
  • return 语句退出整个函数(参见python-course.eu/python3_functions.php),因此for 循环的第一次迭代将命中return 并结束函数。我建议您进行迭代,如果循环内没有数字,则仅返回False,并在for 循环之后返回最终return True。也可以看看alldocs.python.org/3/library/functions.html#all
  • 不要return Truein循环。在循环中检查项目not .isdigit。循环完成后移动return True
  • 请发布一个输入 (a_list) 的最小示例,该输入 (a_list) 应该 评估True 和一个 评估False . ...minimal reproducible example

标签: python python-3.x for-loop


【解决方案1】:

这应该检查列表中的所有项目是否都是数字

if all(str(x).isdigit() for x in a_list):
    return True
else:
    return False

【讨论】:

  • OP 将其扩展为常规 for 循环可能会很好。
【解决方案2】:

有一些有用的内置函数all(和any)用于检查多个条件:

def checker(a_list):
    return all(str(item).isdigit() for item in a_list)

【讨论】:

  • 是的,出于速度原因,@wwii 的答案更好,你的答案更 Pythonic。所以any(not str(item).isdigit() for item in a_list) 将是理想的答案:)
  • @ElRuso all(x ...)not any(not x ...) 是等价的。 en.wikipedia.org/wiki/De_Morgan%27s_laws
  • 你说得对,short cutted 完全一样
  • @ElRuso - for 循环有什么不那么 Pythonic 的?
  • 备用 - all(map(str.isdigit, map(str, a_list)))
【解决方案3】:

不要在循环中返回 True。如果项目不是数字,则在循环中返回 False。循环完成后移动return True

def checker(a_list):
    for item in a_list:
        if not str(item).isdigit():
            return False
    return True

【讨论】:

  • 这个答案来自原始代码,这就是为什么 +1 具有教育意义。
  • @PaulToth - 很确定这个解决方案在功能上等同于 VPIB 的解决方案。您能否提供一个示例输入,说明此函数会产生不正确的结果?
  • @PaulToth - 对于[12, 15, 54, 72],函数应该返回 True 还是 False?
  • @wwii 我的错。我错误地阅读了您的建议,并且面临与以前完全相同的问题。经过更仔细的实施,此修复程序也可以正常工作。十分感谢你的帮助!此外,您发布的列表应该并且确实返回 True。
【解决方案4】:

我假设您要检查 a_list 的所有元素是否返回 True 作为来自 isdigit() 的返回值。

在这种情况下,使用内置函数all

all(str(s).isdigit() for s in a_list)

有关anyall 的更多信息,请查看以下链接:any and all explained

编辑:感谢@RoadRunner 指出转换为 str ,因为 OP 在他给出的示例中有它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2015-12-30
    • 2010-11-02
    • 2023-03-28
    相关资源
    最近更新 更多