我很难按照以下方式安排字典,输入中的给定数字为5
,然后在字典中搜索key=5
将其放在第一个然后是第一个值4
并在字典中搜索key=4
并将其值设为第二个,然后将5
的第二个值设为3
并搜索key=3
in字典并将其值作为第三个
值将是一个或两个整数
我正在绘制一个二叉树,所以如果这里的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 :(得分: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
答案 1 :(得分: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进行排序。这就是你如何能够完成你所要求的,但我会回应其他评论,并说可能有更好的方法去做你想做的事情。