【问题标题】:checking if all elements in a list satisfy a condition检查列表中的所有元素是否满足条件
【发布时间】:2019-07-12 13:09:19
【问题描述】:

我正在尝试遍历函数返回的整数列表。

问题:我想检查列表中的任何元素是否大于特定值(95),然后执行语句一次,而不是每次迭代,即遍历列表,检测大于 95 的数即使有更多,也执行语句。

我已经尝试过,但语句会继续执行多次,满足条件

这是我正在尝试的代码

for path in Path(spath).iterdir():
    for n in cosine_sim(file, path):
        x = all(n)
        if x > 95:
            print("suceess...")

success... 打印多次

【问题讨论】:

  • 也许使用 while 循环而不是 for 循环?
  • 您也可以使用any 调用,例如if any(x > 95 for x in my_list):。我可以举一个更好的例子,但我很困惑你的代码中的列表是什么。同样all 返回一个布尔值,所以你的if x > 95 总是假的。
  • 函数 cosine_sim(file, path) 返回一个列表 (int, int, int, int...)
  • 你的标题是“所有”,但你的描述是“任何”——你的意思是“任何”,对吧?

标签: python python-3.x


【解决方案1】:

Python 的内置函数可以大致完成您想要的操作:

  • 如果iterable 中的至少一个元素为真,则any(iterable) 返回真
  • 如果iterable 中的每个元素都为真,all(iterable) 返回 true

考虑到这一点,一般习惯用法是检查列表中每个元素的条件,然后在其上使用all()any()

for n in cosine_sim(file, path):
    if all(x > 95 for x in n):
        print("success...")

这可能比您想要的要慢一些,因为它实际上必须为每个 x 计算 x > 95。如果您想确保列表中的每个数字nums 不等于零,或者确保strs 中没有字符串为空,则可以使用all(nums)all(strs) - 因为数字 0 和空字符串都评估为 false,所以您不必先将它们转换为布尔值。

【讨论】:

  • ...if all(x > 95 for x in n): TypeError: '>' not supported between 'str' and 'int'...
  • 您在n 中的数据可能存储为字符串而不是整数,在这种情况下,您需要改为使用int(x) > 95。这种类型的解决方案可以根据您需要的任何条件轻松定制,具体取决于您的数据类型以及您需要检查的条件。
  • 请注意,anyall 将分别在条件返回 TrueFalse 时短路。
【解决方案2】:

扩展Green Cloak Guy答案,添加break

for path in Path(spath).iterdir():
    for n in cosine_sim(file, path):
        if all(int(x) < 95 for x in n):
            print("suceess...")
            break
    break

两个break 因为有两个循环...

【讨论】:

    【解决方案3】:

    你也可以这样用:

    your_list=[123,232,121,100,98]
    
    if any(i > 95 for i in your_list):
      print("success...")
    
    

    【讨论】:

    • any(i &gt; 95 for i in your_list) 做起来更简单,而且更快也会导致短路
    猜你喜欢
    • 2013-03-06
    • 2021-12-07
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多