2012-07-19 48 views
0

我希望能夠改造字典中的那個 可設置(完整路徑)選項列表,例如本應通過:從Python字典列出的設置

def test_dic_to_args(self): 
    dic = {"x1": {"x2": "val1"}, "x2": "val3"} 
    des = ["x1.x2:val1", "x2:val3"] 
    self.assertEqual(conf.dict_to_args(dic), des) 

現在我開始寫它,我認爲這很容易,但它比我想象的更復雜,比如隊列,類型檢查等。 有沒有一種聰明的方法來解決這個問題? 也許最好的選擇仍然是一個遞歸的DFS,你怎麼看?

+1

幾乎重複http://stackoverflow.com/questions/10756427的 – schlamar 2012-07-19 11:34:23

回答

6

如果字典應該是任意嵌套的,遞歸方法最可能是最簡單的。

def dict_to_args(d, prefix=()): 
    for k, v in d.iteritems(): 
     if isinstance(v, dict): 
      for x in dict_to_args(v, prefix + (k,)): 
       yield x 
     else: 
      yield ".".join(prefix + (k,)) + ":" + v 

實施例:

>>> list(dict_to_args(dic)) 
['x2:val3', 'x1.x2:val1']