这个问题已经有了答案:
Pythonic way to check if a list is sorted or not
21个答案
我有一个名为checker(nums)的函数,它有一个参数,稍后将接收一个列表。我想用这个列表来检查每个元素是否大于或等于前一个元素。
例子:
我有一个列表,我必须检查它是否满足条件。
既然这样,函数应该返回[1, 1, 2, 2, 3]
我的代码:

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

如果第一个条件为真,则只运行一次并返回真。
我看到了一个声明,如果一切,并不确定如何使用它。

最佳答案

您的功能可以简化为:

def checker(nums):
    return all(i <= j for i, j in zip(nums, nums[1:]))

注意以下事项:
zip并行循环其参数,即检索到nums[0]>nums[1]等。
nums[1]执行实际比较。
用括号nums[2]表示的generator expression确保每次提取一个条件值,即i <= j()。这被称为懒惰评估。
True只需检查所有值是否为False。同样,这是懒惰的。如果从生成器表达式中延迟提取的值之一是all,则它会短路并返回True
选择
为了避免为False的第二个参数构建列表的开销,可以使用False。当您的输入是迭代器时,这个选项特别有用,即它不能像zip那样被切片。
from itertools import islice

def checker(nums):
    return all(i <= j for i, j in zip(nums, islice(nums, 1, None)))

另一个迭代器友好选项是使用itertools.islice list recipe,也可通过第三方获得:
# 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))

关于python - 如何在Python中使用IF ALL语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48868998/

10-12 22:48