Python итерации

1

Кто-нибудь знает, почему этот код не работает нормально? Кажется, не нравится итерации с ключевым словом yield: Я пытаюсь разминировать все цифры с любого уровня списков или диктонов (особенно заинтересованных в списках). На второй итерации он находит [2,3], но не печатает 2 и 3 один за другим... Представьте себе, что у меня может быть много уровней списков.

def digIn( x ):
    try:
        if isDict(x) or isList(x):
            print "X:", x
            for each in x:
                print "each:", each
                if isDict(each) or isList(each):
                    digIn(each)
                else:
                    yield each
        else:
            yield x
    except Exception,ex:
        print ex

print "STARTING OVER"
for i in digIn( [1,[2,3]] ):
    print i
  • 0
    Поскольку ночь, и мы обсуждаем это ... как бы вы увидели эту версию: pastebin.com/nZ2b4LUP ?
  • 0
    в чём разница digIn () с обычным выравниванием?
Показать ещё 3 комментария
Теги:

3 ответа

1

Когда вы рекурсивно вызываете digIn, внутренние выходы не вызывают значения, получаемые от внешнего вызова. Вместо этого рекурсивный digIn возвращает генератор, а затем вы молча отбрасываете этот генератор и теряете внутренние элементы.

Вам нужно явно получить результаты от рекурсивного вызова.

if isDict(each) or isList(each):
    for innerItem in digIn(each):
        yield innerItem
else:
    yield each
  • 0
    хм .. я читал о том, что забыл над доходностью .... это меня беспокоит
  • 0
    да, вы ошиблись
1

digIn(each) неверно. Вы должны перебрать его и получить каждое значение по очереди.

1

Вы должны "повторно выполнить" генератор для рекурсивного повторения всех элементов списка.

if isDict(each) or isList(each):
     for elem in digIn(each):
         yield elem
else:
     yield each
  • 0
    как предполагает Кугельман ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню