我正在使用 Python 2.6.2。我有一个字典,graph
它以元组(源,目标)作为键,并以一定的权重作为其值。
想graph
根据来源按重量降序排序。在具有不同目的地的图元组中可能有多个相同的源。
graph= {(2, 18): 0, (5, 13): 2, (0, 10): 2, (0, 36): 1, (3, 14): 2, (5, 23): 2, (0, 24): 1, (4, 32): 7, (2, 29): 0, (3, 27): 2, (0, 33): 2, (5, 42): 2, (5, 11): 2, (5, 39): 3, (3, 9): 8, (0, 41): 4, (5, 16): 5, (4, 17): 7, (4, 44): 7, (0, 31): 2, (5, 35): 5, (4, 30): 7}
创建了一个中间字典,source_dict
它以源为键,基于源的累积权重为其值,{source:weight}
source_dict={0: 12, 2: 0, 3: 12, 4: 28, 5: 21}
执行如下排序功能后,
source_desc_sort=sorted(source_dict.items(), key=lambda x: x[1], reverse=True)
sortkeys = dict((x[0], index) for index,x in enumerate(source_desc_sort))
graph_sort = sorted(graph.iteritems(), key=lambda x: sortkeys[x[0][0]])
我得到一个排序图,graph_sort
如下所示,
graph_sort= [((4, 17), 7), ((4, 44), 7), ((4, 30), 7), ((4, 32), 7), ((5, 23), 2), ((5, 35), 5), ((5, 13), 2), ((5, 42), 2), ((5, 11), 2), ((5, 39), 3), ((5, 16), 5), ((0, 10), 2), ((0, 36), 1), ((0, 24), 1), ((0, 33), 2), ((0, 41), 4), ((0, 31), 2), ((3, 14), 2), ((3, 27), 2), ((3, 9), 8), ((2, 29), 0), ((2, 18), 0)]
如果您注意graph_sort
同一源的键顺序并不重要,例如对于以 5 作为源的元组, ((5, 23), 2) 可以在 ((5, 35), 5) 之前或之后价值低于另一个。
现在这是我从 2 天前开始尝试解决的挑战,
已重新定义source_dict
为source_dict_angle
以角度作为附加信息,{source:{angle:weight}}
source_dict_angle={0: {0: 2, 90: 4, 180: 6}, 2: {0: 0, 270: 0}, 3: {180: 4, 270: 8}, 4: {0: 7, 180: 21}, 5: {0: 6, 90: 10, 180: 2, 270: 3}}
我喜欢进行与上述相同的排序,但基于来源角度。例如,以 4 作为源且目标在角度 180 的元组必须首先开始,因为它具有最高值,即 21。其次是以 5 作为源和目标在角度 90 的元组,依此类推。
有中间字典,relation_graph
其中有目的地相对于源的位置信息,{source:{angle:destination:value}}
relation_graph={0: {0: {32: [1], 36: [1], 23: [1], 24: [1], 16: [1]}, 90: {3: [1], 41: [1], 44: [1]}, 180: {33: [1], 10: [1], 31: [1]}}, 1: {}, 2: {0: {18: [1]}, 270: {29: [1]}}, 3: {180: {27: [1], 14: [1], 31: [1]}, 270: {0: [1], 33: [1], 36: [1], 9: [1], 1: [1], 24: [1], 41: [1], 10: [1]}}, 4: {0: {32: [1], 18: [1], 23: [1]}, 180: {0: [1], 33: [1], 44: [1], 14: [1], 15: [1], 17: [1], 21: [1], 41: [1], 27: [1], 30: [1], 31: [1]}}, 5: {0: {42: [1], 11: [1], 23: [1]}, 90: {7: [1], 8: [1], 16: [1], 35: [1]}, 180: {0: [1], 13: [1], 14: [1], 44: [1]}, 270: {1: [1], 2: [1], 39: [1], 29: [1]}}}
预期结果
graph_sort_angle= [((4, 17), 7), ((4, 44), 7), ((4, 30), 7), ((5, 35), 5), ((5, 16), 5), ((3, 9), 8), ...
我目前还找不到解决方案,我正在尝试重用我已经完成的解决方案,graph_sort
但效果不佳。有感觉我必须以不同的方式来做。
有什么方法可以使用与我相同的方法graph_sort
吗?
感谢您能给我一些指示。
到那时将继续努力。
附加说明 2013 年 1 月 9 日晚上 9 点 30 分:Lennart Regebro
我想graph
根据来自的降序值对(元组)的键进行排序source_dict_angle
。
graph
由 (source, destination) 组成,但source_dict_angle
只有源和角度信息,{source:{angle:weight}}。它没有目的地信息。我们将无法graph
像在第一个示例中那样对元组进行排序。
给定(未计算)relation_graph
,我们有源、角度和目的地信息,{source:{angle:destination:value}}。我们将使用这个字典来查看使用哪个角度(0 度、90 度、180 度或 270 度)的源对与哪个目的地。
所以我们会
首先参考
source_dict_angle
知道哪个是最高值。在这个给定的示例中,角度为 180 度的源 4 具有最高值,即 21我们将 Source 4 的所有目的地与来自 的角度 180 进行比较
relation_graph
,即 [0, 33, 44, 14, 15, 17, 21, 41, 27, 30, 31] 如果它存在于 中graph
。如果是,我们将 (Source, Destination) 元组排在第一位,即 (4, 17)。这也可以用另一种方式完成,因为我们必须对 Source 4 进行排序,我们检查 Source 4 in 的任何目的地是否graph
存在于 Source 4 的角度 180 inrelation_graph
. 如果是,我们将 (Source, Destination) 元组排在第一位。由于相同的源可以使用相同的角度与多个目的地配对,因此我们可能有多个 (Source, Destination) 元组。例如 (4, 17)、(4, 44) 和 (4, 30)。这意味着,源 4 使用角度 180 连接到目标 17、目标 44 和目标 30,因此是 3 对元组。这 3 对元组之间的顺序不是问题。完成此操作后,我们将在执行上述步骤时转到下一个最高值,
source_dict_angle
直到所有源都按降序排序。