Генератор, который выдает подшаблоны исходного шаблона с введенными нулями

#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 тому, что вы ожидаете от них.

Просто мысль.

Ханну