Python декларативный l oop рефакторинг (требуется доступ к нескольким элементам) - PullRequest
2 голосов
/ 09 марта 2020

Привет, у меня есть этот кусок кода, и я пытаюсь сделать его декларативным. Но AFAIK, все декларативные методы, такие как map() reduce() filter(), пропустят oop через каждый элемент контейнера, а не несколько таких

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 Ответ

2 голосов
/ 09 марта 2020

Сначала вы можете использовать zip для перезаписи вашего l oop:

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 ниже.


Если вы хотите Мими c функциональный стиль:

import operator, functools

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

Но это действительно unpythoni c!

...