我正在使用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_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,依此类推。 / p>
拥有中间词典,relation_graph
,其中包含目的地相对于来源的位置信息,{来源:{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.30PM:Lennart Regebro
我想根据graph
的降序值对source_dict_angle
(元组)的键进行排序。
graph
由(来源,目的地)组成,但source_dict_angle
只有源和角度信息{source:{angle:weight}}。它没有目的地信息。我们无法像在第一个示例中那样对graph
中的元组进行排序。
我们得到(未计算)relation_graph
,其中我们有源,角度和目的地信息,{source:{angle:destination:value}}。我们将使用这个字典来查看哪个源对使用哪个角度(0度,90度,180度或270度)。
所以我们将
首先参考source_dict_angle
以了解哪个是最高值。
在该给定的例子中,角度为180度的源4具有最高值,即21
我们比较来自relation_graph
的角度为180的源4的所有目的地,即[0,33,44,14,15,17,21,41,27,30,31](如果存在)在graph
。如果是,我们将(源,目的地)元组排在第一位,即(4,17)。这也可以用另一种方式完成,因为我们必须对源4进行排序,我们检查graph
中源4的任何目的地是否存在于relation_graph
中的源4的角度180中。如果是,我们将(源,目的地)元组排在第一位。由于相同的源可以使用相同的角度与多个目标配对,因此我们可以拥有多个(源,目标)元组。例如(4,17),(4,44)和(4,30)。这意味着,Source 4使用角度180连接到Destination 17,Destination 44和Destination 30,因此连接3对元组。这三对元组之间的顺序不是问题。
完成此操作后,我们转到source_dict_angle
执行上述步骤的下一个最高值,直到所有来源按降序排序。
答案 0 :(得分:2)
略读中间词典,这不是必需的。
要对源进行排序,您只需:
graph_sort = sorted(graph.iteritems(), key=lambda x: x[0][0])
对于您所处的角度进行排序:
def angle(x):
key, value = x
source, destination = key
return <insert angle calculation here>
graph_sort = sorted(graph.iteritems(), key=angle)
更新
您需要停止使用不同字典的负载来保存所有属于一起的不同数据。为保留所有信息的项创建一个类。
从我的问题中我可以收集到的图表项目字典可以保存来源,目的地和权重。然后你又有了另一本字典来保持这种怀疑。然后你有第三个保持角度的字典。
相反,只需这样做:
class Graph(object):
def __init__(self, source, destination, weight, angle):
self.source = source
self.destination = destination
self.weight = weight
self.angle = angle
您的排序问题现在很简单。