2012-11-20 86 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