выражение генератора с проверкой значения - PullRequest
2 голосов
/ 19 мая 2019

У меня есть следующий фрагмент кода, чтобы узнать, соответствует ли любая пара из данного списка чисел данной сумме.

Я реализовал функцию следующим образом

def google(numbers, total):
    complement =[]
    for x in numbers:
        if x in complement:
            return True
        else: complement.append(total-x)
    return False

print google([1,2,3,4,5],8)

Мой вопрос заключается в том, существует ли ЛЮБОЙ ВОЗМОЖНЫЙ способ реализовать это как выражение генератора. ?

Например, есть ли способ проверить, имеет ли частично созданный в настоящее время генератор заданное значение внутри понимания?

1 Ответ

1 голос
/ 19 мая 2019

Если вы действительно хотите это сделать, все возможно, но не все желательно:

from itertools import combinations, dropwhile

def google(numbers, total):
    return bool(next(dropwhile(lambda c: sum(c) != total, combinations(numbers, 2)), False))

Мы перебираем все возможные комбинации из двух чисел numbers, используя combinationsи сравните их с total.

Используя dropwhile, мы можем эмулировать поведение короткого замыкания вашего исходного кода, получая только комбинацию first , которая удовлетворяет условию, если оно существует.Затем, как непустое tuple, оно будет преобразовано в логический литерал True.В противном случае next увидит, что dropwhile пусто, и вернет значение по умолчанию False.

Проверка:

print(google([1, 2, 3, 4, 5], 8))
print(google([1, 2, 3, 4], 8))

Вывод:

True
False
...