2012-11-20 38 views
10

Örnek içine bir sözlük dönüştürme: Böyle bir öğe listesi için bu sözlüğü dönüştürmek çalışıyorumlistesi

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'] 

Hangi yöntem kullanmalıyım?

Zaten something.items() çalıştı, ama ne Döndüğümden oldu: Yanlış bir şey yaptıysam lütfen bildirin böylece

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

Bu benim ilk kez burada gönderme olduğunu.

Teşekkürler ve garip yazı için özür dilerim.

+1

Bu nedenle, iç içe geçmiş sözlüklerin tuşlarından * sıralanmış * bir liste oluşturmak ve işlemdeki kopyaları atmak istiyorsunuz. Bu konuda mı? – 0xC0000022L

cevap

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

Sen yapısını düzleştirmek için bir işlevi kullanmak gerekir:

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

(Python 3 kullanıyorsanız .iteritems().items() ile değiştirilmesi gerekir).

piton 3.3 ve daha yeni, sen de yeni yield from syntax kullanabilirsiniz: Bu yinelemeli tüm anahtarları verecektir

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

. Bir liste kullanıma o açmak için: Python sözlükleri sırasız olan

list(flatten(elements)) 

beri dönen tuşlarının sıralaması sıralanacak gitmiyor. Anahtarlarınızın belirli bir sipariş vermesini istiyorsanız, sonucu açıkça sıralamanız gerekir.

+0

+1, 'verim' işlevi daha ince yapar. – eumiro

+0

Çok teşekkür ederim, işe yaradı. – Neox