2011-04-21 82 views
1

有沒有人知道爲什麼這段代碼無法順利運行?它似乎不喜歡與yield關鍵字的迭代: 我試圖從任何級別的列表或字典(尤其對列表感興趣)中挖掘所有數字。 在第二次迭代中,它找到[2,3],但是無法一個接一個地打印2和3 ...想象一下,我可以有很多級別的列表。Python迭代

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

既然是晚上了,我們正在討論它......你怎麼看這個版本:http://pastebin.com/nZ2b4LUP? – hephestos 2011-04-21 18:25:36

+0

digIn()與普通磨平的區別是什麼? – tokland 2011-04-21 20:09:40

+0

@tokland,你是什麼意思? – hephestos 2011-05-19 07:11:08

回答

1

您應該「重新產生」生成器以迭代遍歷所有列表元素。

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

像庫格爾曼建議的... – hephestos 2011-04-21 18:26:25

1

digIn(each)不正確。你必須迭代它,然後依次產生每個值。

1

當您遞歸調用digIn時,內部收益不會導致從外部調用產生值。相反,遞歸digIn正在返回一個生成器,然後你默默地放棄該生成器並丟失內部項目。

您需要明確地產生遞歸調用的結果。

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

嗯..我讀了關於屈服的遺忘事情....這個麻煩我 – hephestos 2011-04-21 18:26:04

+0

是的,你不正確地縮進 – 2011-04-21 19:45:38