#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