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)