2012-11-20 50 views
10

例子:轉換字典到列表

something = { 
    "1": { 
     "2": { 
      "3": { 
       "4": {}, 
       "5": {}, 
       "7": {}, 
       }, 
      "8": { 
       "9": {}, 
       "10": {} 
      }, 
      "11": { 
       "12": { 
        "13": { 
         "14": { 
          "15": { 
           "16": { 
            "17": { 
             "18": {} 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

我想轉換本詞典中像這樣的項目清單:

['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18'] 

我應該用什麼方法?

我已經嘗試過something.items(),但我回來是:

[('1', {'2': {'11': {'12': {'13': {'14': {'15': {'16': {'17': {'18': {}}}}}}}}, '8': {'9': {}, '10': {}}, '3': {'5': {}, '4': {}, '7': {}}}})] 

這是我第一次在這裏發帖,所以如果我做錯了什麼,請讓我知道。

謝謝你,併爲這個奇怪的帖子感到抱歉。

+1

所以你想從一些嵌套字典的關鍵字*排序*列表,丟棄過程中的任何重複。這是關於它嗎? – 0xC0000022L

回答

6
something = {'1': {'2': {'11': {'12': {'13': {'14': {'15': {'16': {'17': {'18': {}}}}}}}}, '3': {'4': {}, '5': {}, '7': {}}, '8': {'10': {}, '9': {}}}}} 
a = [] 

def flatten(d,a): 
    for k,v in d.items(): 
     a.append(k) 
     flatten(v, a) 
flatten(something, a) 

# a == ['1', '2', '11', '12', '13', '14', '15', '16', '17', '18', '8', '9', '10', '3', '5', '4', '7']" 
24

你需要使用的功能扁平化的結構:

def flatten(d): 
    for key, value in d.iteritems(): 
     yield key 
     for sub in flatten(value): 
      yield sub 

(該.iteritems()應與.items()如果你正在使用Python 3替換)。

關於Python 3.3和較新的,你也可以使用新的yield from syntax

def flatten(d): 
    for key, value in d.items(): 
     yield key 
     yield from flatten(value) 

這將遞歸得到所有的按鍵。爲了把它轉換成一個列表使用:

list(flatten(elements)) 

由於Python字典是無序的,返回鍵的順序是不會進行排序。如果您希望您的密鑰具有特定的順序,則必須對結果進行顯式排序。

+0

+1,'yield'使功能更加苗條。 – eumiro

+0

非常感謝,它的工作。 – Neox