为了账号安全,请及时绑定邮箱和手机立即绑定

Python 声明性循环重构(需要访问多个元素)

Python 声明性循环重构(需要访问多个元素)

猛跑小猪 2022-08-25 15:13:37
我有这段代码,并试图重构它以声明性。但是AFAIK,所有声明式方法都会循环遍历容器的每个元素,而不是像这样的几个map()reduce()filter()def arrayCheck(nums):    # Note: iterate with length-2, so can use i+1 and i+2 in the loop    for i in range(len(nums)-2):        # Check in sets of 3 if we have 1,2,3 in a row        if nums[i]==1 and nums[i+1]==2 and nums[i+2]==3:            return True    return False那么如何编写这段代码,声明性的方式呢?
查看完整描述

1 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

首先,您可以使用 a 来重写循环:zip


def array_check(nums):

    for a, b, c in zip(nums, nums[1:], nums[2:]):

        if a == 1 and b == 2 and c == 3:

            return True

    return False

然后,使用元组比较:


def array_check(nums):

    for a, b, c in zip(nums, nums[1:], nums[2:]):

        if (a, b, c) == (1, 2, 3):

            return True

    return False

然后是内置的:any


def array_check(nums):

    return any((a, b, c) == (1, 2, 3) for a, b, c in zip(nums, nums[1:], nums[2:]))

测试:


>>> array_check([1,3,4,1,2,3,5])

True

>>> array_check([1,3,4,1,3,5])

False

注意:有关更快的版本,请参阅下面的@juanpa.arrivillaga评论。


如果你想模仿功能风格:


import operator, functools


def array_check(nums):

    return any(map(functools.partial(operator.eq, (1,2,3)), zip(nums, nums[1:], nums[2:])))

但这真的很不合理!


查看完整回答
反对 回复 2022-08-25
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信