Как получить новый вход для генератора в Python без создания нового генератора - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь написать код, который получает список и генерирует все эти преобразования, используя оператор yield.

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

def permute(items):
    permutations = [x for x in itertools.permutations(items)]
    permutations.sort()
    for n in permutations:
        yield (n)

g = permute(['b','a','c'])
print(next(g)) #('a', 'b', 'c')
print(next(g)) #('a', 'c', 'b')
g.send(['e','q','c'])
print(next(g)) #('b', 'c', 'a') need to be ('c', 'e', 'q')

Как очистить список перестановок и повторить шаг сортировки списка перестановок без создания нового генератора?

Ответы [ 2 ]

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

Почему бы просто не создать новый объект типа permute и использовать его

import itertools
def permute(items):
    permutations = [x for x in itertools.permutations(items)]
    permutations.sort()
    for n in permutations:
        yield (n)

g = permute(['b','a','c'])
print(next(g)) #('a', 'b', 'c')
print(next(g)) #('a', 'c', 'b')

g =  permute(['e','q','c'])
print(next(g)) #('b', 'c', 'a') need to be ('c', 'e', 'q')
#I get ('c', 'e', 'q')
0 голосов
/ 03 мая 2019

Для работы с send необходимо выполнить присвоение something = yield something_else и проверить значение something: это будет None при вызове next(g) и value, если g.send(value)назывался.

Вот одно из возможных решений:

import itertools

def permute(items):
    permutations = [x for x in itertools.permutations(items)]
    permutations.sort()
    it = iter(permutations)
    while True:
        new_items = yield next(it)
        if new_items is not None:
            yield None  # it is yielded for g.send()
            permutations = [x for x in itertools.permutations(new_items)]
            permutations.sort()
            it = iter(permutations)

g = permute(['b','a','c'])
print(next(g)) #('a', 'b', 'c')
print(next(g)) #('a', 'c', 'b')
g.send(['e','q','c'])
print(next(g)) #('c', 'e', 'q')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...