2014-01-13 201 views
-1

我想通過一個有未知數量的嵌套圖層的字典循環。Python:如何繼續嵌套for循環?

我想編寫一個循環遍歷每一層直到最後的函數。

我相信這裏需要一個遞歸函數,但是我想就如何去做提供一些建議。

這裏的代碼邏輯:

for levelone in file: 
    for leveltwo in levelone: 
     for levelthree in leveltwo: 
      for levelfour in levelthree: 
       .... 

你們有什麼覺得?

+1

你能更具體是什麼意思?你想繼續levelthree嗎?你怎麼知道有多少循環_available_? – kojiro

+0

似乎你要求突破 – zhangxaochen

+1

你問你如何處理未指定數量的嵌套列表/ iterables? –

回答

1

要做到這一點遞歸您需要測試每個值,看它是否也是一個字典,這是蟒蛇有點難看,可能不是很有效。如果是這樣,你可以再次調用函數並將該返回與迄今爲止的結果相結合。如果這不是字典,那麼您處於底層,可以根據您的價值做任何事情。

def recurseDict(nested_dict): 
    output = [] 

    for key, value in nested_dict.iteritems(): 
     if isinstance(value,dict): 
      output = output + recurseDict(value) 
     else: 
      # Do whatever you want here, I'll just add the values to a list 
      output.append(nested_dict[key]) 
    return output 

樣品的輸入和輸出:

In [28]: a = {'blue': 4, 'green': {'yellow': {'black': 16}}, 'red': 3} 

In [29]: recurseDict(a) 
Out[29]: [4, 16, 3] 
1

我想你想要做的是這樣的:

def loop_through(iterable): 
    try: 
     for item in iterable: 
      # do your thing 
      loop_through(item) 
    except TypeError: 
     # not iterable, reached the bottom 

一旦你已經把相應的功能,你可以loop_through(file)。根據你想要做什麼,你可能需要從遞歸調用return東西,處理它,或者創建一個容器,把結果:

def loop_through(iterable, container=None): 
    if container is None: 
     container = [] 
    try: 
     for item in iterable: 
      # do your thing 
      loop_through(item, container) 
    except TypeError: 
     # not iterable, reached the bottom 
+0

您的解決方案比我的集裝箱更具模塊性。除了這裏的嘗試會被認爲是更pythonic,你認爲? –

+0

我通常更喜歡'try:除了:'在這些情況下;'它允許你使用任何支持適當行爲的iterable(list,dict,tuple,set,...)或對象(不一定是'dict'子類),而不是顯式檢查其中的一個。 – jonrsharpe

+0

的確如此,但是如果你不得不在字典中操縱數值,那麼你必須做的不僅僅是遍歷它們。 –

0

使用break

for levelone in file: 
    for leveltwo in levelone: 
     for levelthree in leveltwo: 
      for levelfour in levelthree: 
       break # Continue levelthree iterations.