2012-11-20 14 views
10

Przykład:Konwersja słownika na listę

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

Próbuję przekonwertować ten słownik do listy przedmiotów, takich jak ten:

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

Jakie metody należy użyć?

Próbowałem już something.items(), ale co wróciłem było:

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

To jest mój pierwszy raz delegowania tutaj, więc jeśli zrobiłem nic złego, proszę dać mi znać.

Dziękuję i przepraszam za dziwaczny post.

+1

A zatem chcesz otrzymać * posortowaną * listę z kluczy wielu zagnieżdżonych słowników, odrzucając wszelkie duplikaty w procesie. Czy to o tym? – 0xC0000022L

Odpowiedz

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

Musisz użyć funkcji do spłaszczyć strukturę:

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

(.iteritems() należy zastąpić .items() jeśli używasz Python 3).

na Python 3.3 i nowsze, można również korzystać z nowej yield from syntax:

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

To będzie rekurencyjnie otrzymując wszystkie klucze. Aby włączyć to do użycia listy:

list(flatten(elements)) 

Ponieważ słowniki Python są nieuporządkowane, kolejność kluczy zwracanych nie ma być sortowana. Będziesz musiał jawnie posortować wynik, jeśli chcesz, aby twoje klucze miały określoną kolejność.

+0

+1, 'yield' sprawia, że ​​funkcja jest cieńsza. – eumiro

+0

Dziękuję bardzo, zadziałało. – Neox

Powiązane problemy