#python #generator #yield
#python #генератор #выход
Вопрос:
У меня следующая проблема, в которой я хочу генерировать шаблоны с введенным 0. Проблема в том, что это должно быть экономичным, и поэтому я хотел бы использовать генератор, который создает и возвращает один из шаблонов за раз (т. Е. Я не хочу создавать список и возвращать его.) Я в растерянности, потому что я не знаю, что я делаю неправильно при вызове генератора, поэтому буду признателен за любую помощь!
оригинальный шаблон = [ 0. 1. 1. 2.] генератор должен генерировать и возвращать эти: [ 0. 0. 1. 2.], [0. 1. 0. 2.], [ 0. 1. 1. 0.]
Однако я могу просто вывести один из шаблонов с помощью вызова генератора (дополнительный 1.0 не является проблемой, чтобы не вызывать путаницы …), а не все из них подряд.
полученный подшаблон = (массив([ 0., 1., 0., 2.]), 1.0)
Ниже приведен мой код:
import numpy as np
def removeoneletter(subpattern):
# generator = []
originalpattern = subpattern
subpatterncopy = subpattern.copy()
nonzero = np.nonzero(subpattern)
listnonzero = nonzero[0].tolist()
# only replace elements at nonzero positions with zero
for i in listnonzero:
subpatterncopy = subpattern.copy()
position = i
transaction = subpatterncopy[i]
np.put(subpatterncopy, position, 0)
print('subpattern generator')
print(subpatterncopy)
# generator.append((subpatterncopy, transaction))
yield((subpatterncopy, transaction))
if i == len(listnonzero):
break
и функция вызывается другой функцией следующим образом:
def someotherfunction():
combinations = removeoneletter(subpatterncopy)
for x in combinations:
# x = next(combinations)
print('yielded subpattern')
print(x)
Комментарии:
1. конечно, извините, я не видел, что он не поддерживался. Теперь я добавил пробелы и надеюсь, что теперь они точны. Спасибо.
2. Вы должны упомянуть, что это проблема numpy, и добавить «импортировать numpy как np» соответственно.
3. эй, да, я добавил импорт. Однако на самом деле это не проблема numpy. Потому что код генерирует шаблоны просто отлично. Это проблема с получением от генератора. Однако я понял, что он делает то, что должен делать с опубликованным кодом. Но что-то в задней части someotherfunction испортило то, что я пытался сделать. В основном это была проблема с отступом. Теперь я решил это. Возможно, остальная часть кода может помочь другому человеку. Поэтому я переименую вопрос.
Ответ №1:
Не будучи экспертом по numpy, эта часть выглядит немного странно для меня:
for i in listnonzero:
....
if i == len(listnonzero):
break
Ваш цикл for присваивает элементам listnonzero значение i, а затем вы проверяете это на соответствие длине списка. Если в listnonzero было пять элементов [5,42,6,77,12], и первый элемент, который вы выбираете из списка, имеет номер 5, вы бы прервали цикл и завершили работу после первой итерации.
Ваш код (вероятно) будет работать на Javascript или аналогичном, где «для i в чем-то» присваивает индекс i вместо элемента списка.
Если это не помогает, попробуйте удалить yield и добавить туда оператор print, чтобы узнать, соответствуют ли ваши listnonzero и i тому, что вы ожидаете от них.
Просто мысль.
Ханну