2016-03-29 2 views
4

Мне тяжело пытаться упорядочить словарь согласно следующему порядку заданное число на входе, которое является 5, тогда найдите key=5 в словаре положите его первым, а затем его первым значением 4 и выполните поиск по key=4 в словаре и поставить его значение в качестве второго, а затем второе значение 5 которое 3 и поиск key=3 в словаре и поставить его значение в качестве третьегоКак я могу упорядочить словарь?

значения будет один или два целых числа

Я работаю в рисование двоичного дерева, поэтому будет проще, если корневой узел (родительский), который равен 5 вновь стать первым, а затем его дети, дети и т.д. следующий

Я пытался организовать его с помощью OrderedDict, но я не мог найти вместе с ним

Может кто-то мне помочь, пожалуйста?

Вход:

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

Выход:

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

Обновленный код:

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

Где находится вход, то есть порядок ключей? Буквально из 'input' или' raw_input'? – timgeb

+0

Я хочу расположить его в соответствии с корневым узлом (ключом) в словаре, сначала сначала введите корневой узел = 5, а затем значения корневого узла и найдите его в ключах словаря и поместите следующий – Joe

+0

и снова, пока end, и если номер значения не существует в ключе словаря continue – Joe

ответ

3

Это интересный вопрос, потому что он тонко сложнее, чем вы думаете. Это окунается в поиск путей, поэтому такие вещи, как поиск в глубину и первый раз, важны для размышлений.

Из вашего образца в/из, похоже, вы хотите получить поиск по ширине, поэтому нам понадобится очередь для работы. Конечно, вам также понадобится OrderedDict для размещения ваших узлов по мере их нахождения и заполнения, а также ваших данных образца.

from collections import OrderedDict 
from queue import Queue 

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

Вы дали первый узел из где-то, так просто называют, что аргумент функции, перейдите захватить каждый элемент в значение этого ключа, и добавить его в очередь, а затем протолкнуть очереди, пока вы «Сделано!

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

Я получаю сообщение об ошибке здесь v = k.get (in_, k) AttributeError: объект 'int' не имеет атрибута 'get' – Joe

+0

@ Joe да, у меня там был мозг. Я уже исправил это. Должен быть 'in_.get (k)' –

+0

теперь его рабочий – 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])) 

Вместо сортировки численно, вы можете заменить sorted_keys с однако вы хотите отсортировать dict. Вот как вы можете выполнить то, что вы просите, но я бы повторил другие комментарии и сказал, что, вероятно, лучший способ сделать то, что вы пытаетесь сделать.

Смежные вопросы