Итерации Python

#python

#питон #python

Вопрос:

Есть ли у кого-нибудь идеи, почему этот код не работает гладко? Похоже, ему не нравятся итерации с ключевым словом yield: я пытаюсь добыть все числа из списков любого уровня или dicts (особенно интересуют списки). На второй итерации он находит [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
  

Комментарии:

1. Поскольку сейчас ночь, и мы обсуждаем это … Как бы вы посмотрели на эту версию: pastebin.com/nZ2b4LUP ?

2. в чем разница digIn() с обычным flatten?

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

4. На деле. Предполагается, что он будет работать под большой нагрузкой dicts и списков, внутри которых может существовать бесконечное количество dicts, списков и простых переменных. В конечном итоге мне нужны данные из всей этой «экосистемы». Таким образом, он должен определить, какого рода данные, и, конечно, рекурсивно выполнить итерацию внутри него.

Ответ №1:

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

 if isDict(each) or isList(each):
     for elem in digIn(each):
         yield elem
else:
     yield each
  

Ответ №2:

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

Ответ №3:

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

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

 if isDict(each) or isList(each):
    for innerItem in digIn(each):
        yield innerItem
else:
    yield each