如何在Python中使用IF ALL语句

Lau*_*iuS 12 python sorting if-statement list conditional-statements

我有一个名为checker(nums)的函数,它有一个参数,稍后会收到一个列表.我想对该列表做的是检查每个其他元素是否大于或等于前一个元素.示例:我有一个列表[1, 1, 2, 2, 3],我必须检查它是否满足条件.既然如此,函数应该返回True

我的代码:

def checker(nums):
    for x in range(len(nums)):
        if x+1<len(nums):
            if nums[x] <= nums[x+1] and nums[-1] >= nums[-2]:
                return True
Run Code Online (Sandbox Code Playgroud)

这将只运行一次,如果第一个条件为真,则返回True.我已经看过一个声明,如果所有并且不确定如何使用它.

jpp*_*jpp 30

您的功能可以简化为:

def checker(nums):
    return all(i <= j for i, j in zip(nums, nums[1:]))
Run Code Online (Sandbox Code Playgroud)

请注意以下事项:

  • zip通过其在平行参数循环,即nums[0]&nums[1]被检索,然后nums[1]nums[2]
  • i <= j 执行实际比较.
  • 由括号表示的生成器表达式()确保条件的每个值,即,True或者False一次一个地提取.这称为惰性评估.
  • all只需检查所有值即可True.再次,这是懒惰的.如果从生成器表达式中延迟提取的值之一是False,则它会短路并返回False.

备择方案

为了避免为第二个参数构建列表的费用zip,您可以使用itertools.islice.当您的输入是迭代器时,此选项特别有用,即它不能像a那样切片list.

from itertools import islice

def checker(nums):
    return all(i <= j for i, j in zip(nums, islice(nums, 1, None)))
Run Code Online (Sandbox Code Playgroud)

另一个对迭代器友好的选择是使用itertools pairwise配方,也可以通过第三方获得more_itertools.pairwise:

# from more_itertools import pairwise  # 3rd party library alternative
from itertools import tee

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

def checker(nums):
    return all(i <= j for i, j in pairwise(nums))
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 10

事实上,您的代码可以简化为检查是否nums已排序,例如

def checker(nums):
    return sorted(nums) == nums
Run Code Online (Sandbox Code Playgroud)

这完全符合您的期望,例如

>>> checker([1, 1, 2, 2, 3])
True
>>> checker([1, 1, 2, 2, 1])
False
Run Code Online (Sandbox Code Playgroud)

  • 缺点是该解决方案是O(N log N).优点是简单 (3认同)