2016-03-29 40 views
4

5 girdisinde belirtilen sayıya göre girdiyi aşağıdaki şekilde sıralamaya çalışıyorum, sonra sözlükte key=5 için arama yaptıktan sonra, ilk değeri ve sözlüğünde key=4 için arama yapmaya çalışıyorum. ve değerler bir veya iki tamsayıSözlük nasıl düzenleyebilirim?

ben çalışıyorum

olacak ikinci olarak değerini koyup 35 ikinci değer olan ve sözlükte key=3 aramak ve üçüncü

olarak değerini koymak İkili bir ağaç çizmek, böylece kök düğümün (ebeveyn) 5 o olması daha kolay olacaktır. re olmak vs Ben OrderedDict kullanarak düzenlemek için çalıştı ama ben

Birisi bana lütfen yardımcı olabilir uzakta onunla bulamadı

sonraki alt öğeleri, çocuk daha sonra ilk ve?

Girdi:

{8: [9], 3: [6, 8], 4: [2, 1], 5: [4, 3], 6: [0, 7]} 

Çıktı:

{5: [4, 3], 4: [2, 1], 3: [6, 8], 6: [0, 7], 8: [9]} 

Güncelleme Kod:

def dfs(cur, prev, edges, res): 
    for next in edges[cur]: 
     if next == prev: continue 

     res.setdefault(cur, []).append(next) 

     dfs(next, cur, edges, res) 


def construct_tree(edges, root): 
    d = {} 
    x = [] 
    for edge in edges: 
     u, v = edge 
     d.setdefault(u, []).append(v) 
     d.setdefault(v, []).append(u) 

    res = {} 

    dfs(root, -1, d, res) 

    return res 

if __name__ == '__main__': 

     root_node = 5 
     edges = [[2, 4], [4, 1], [0, 6], [7, 6], [8, 9], [4, 5], [6, 3], [3, 5], [3, 8]] 
     print((construct_tree(edges, root_node))) 
+0

Giriş nerede, yani anahtarların sırası nereden geliyor? 'Input' veya 'raw_input' kelimelerinden tam anlamıyla mı? – timgeb

+0

Bunu sözlükte kök düğüme (anahtar) göre, önce kök düğümü = 5 önce ve sonra kök düğümün değerlerine göre düzenlemek ve onu sözlük tuşlarında arayarak sonraki – Joe

+0

ve daha sonra son ve eğer sözlük numarası yok ise sözlük anahtarında devam ederse – Joe

cevap

3

Bu ilginç bir soru, çünkü düşündüğünüzden çok daha karmaşık olduğundan. Bu, yol bulmaya sürüklenir, bu nedenle derinlik-ilk ve geniş kapsamlı ilk aramalar gibi şeyler düşünmek için önemlidir.

Örneğinizi içe/dışa, geniş kapsamlı bir ilk arama yapmak istediğinize benziyor, bu yüzden çalışmak için bir sıraya ihtiyacımız var. Elbette, düğümlerinizi buldukça, doldurduğunuzda ve örnek verilerinizi yerleştirmek için bir OrderedDict'a ihtiyacınız olacaktır.

from collections import OrderedDict 
from queue import Queue 

sample_dict = {8: [9], 3: [6, 8], 4: [2, 1], 5: [4, 3], 6: [0, 7]} 

Bir yere ilk düğümü verilen konum yüzden sadece işlevine bir argüman, yani anahtarın değeri her bir öğeyi kapmak gidip böyle hitap ve sıranıza eklemek, o zaman dek kuyrukta ile itmek İşin bitti!

def sort_the_dict(in_, firstkey): 
    # in_ is your sample data. 
    result_dict = OrderedDict() 
    q = Queue() 
    q.put_nowait(firstkey) 

    while not q.empty(): 
     k = q.get_nowait(): 
     v = in_.get(k) 
     if v is not None: 
      # if a value exists for that key 
      result_dict[k] = v 
      for vv in v: 
       q.put_nowait(vv) 

    return result_dict 
+0

Burada bir hata alıyorum v = k.get (in_, k) AttributeError: 'int' nesnesi 'get' özelliği yoktur – Joe

+0

@Joe Evet Orada bir beyin osurusu vardı. Onu çoktan tamir ettim. Olmalıdır in_.get (k) ' –

+0

şimdi çalışma – Joe

2
from collections import OrderedDict 

d = {8: [9], 3: [6, 8], 4: [2, 1], 5: [4, 3], 6: [0, 7]} 

sorted_keys = sorted([x for x in d]) 
sorted_d = OrderedDict(zip(sorted_keys, [d[k] for k in sorted_keys])) 

yerine sayısal sıralama, sen sıralamak istediğiniz ancak birlikte sorted_keys yerine Dict. İstediğin şeyi bu şekilde yapabiliyorsun, ama diğer yorumları ekleyebilir ve muhtemelen yapmaya çalıştığın her şeyi yapmanın daha iyi bir yolu olduğunu söyleyebilirim.