我正在使用Python 2.6.2。我有一个字典,它有元组(源,目的地)作为它的值具有一定的权重的关键。复杂排序 - 多键
想对根据重量的降序排列源。在不同目的地的图的元组中可能有多于一个相同的源。
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)之前出现)或者在事件之后,尽管一方的价值低于另一方。
现在,这是我的挑战,我正努力从3天前解决,
重新定义source_dict
到source_dict_angle
与角度补充信息,{来源:{角度:重量}}
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
其具有相对于源目的地的位置信息,{源:{角度:目的地:值}}
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日下午九时30分:梅里Regebro
我想的(元组)的基础上,从source_dict_angle
降值按键排序。
由(来源,目标)组成,但source_dict_angle
只有来源和角度信息{来源:{角度:权重}}。它没有目的地信息。我们无法像第一个例子中那样对中的元组进行排序。
给出(未计算)relation_graph
,其中我们有源,角度和目的地信息{来源:{angle:destination:value}}。我们将使用这个字典来查看哪个源与哪个目的地使用哪个角度(0度,90度,180度或270度)。
因此,我们将
首先是指
source_dict_angle
知道这是最高值。 在该给定示例中,源4与角180度具有即21我们从
relation_graph
比较源4的所有目的地与角180的最高值,即[0,33,44,14,15,17, 21,41,27,30,31],如果它存在于。如果是,我们将(源,目标)元组排列在第一位,即(4,17)。这也可以用另一种方式完成,因为我们必须对来源4进行排序,我们检查来源4中的任何一个目的地是否存在于源4的角度180中relation_graph
。如果是,我们将(源,目标)元组排在第一位。由于同一个源可以使用相同的角度与多个目标进行配对,因此我们有可能拥有多个(源,目标)元组。例如(4,17),(4,44)和(4,30)。这意味着,源4使用角度180连接到目的地17,目的地44和目的地30,因此是3对元组。这3对元组之间的顺序不成问题。一旦完成了这一步,我们将转到
source_dict_angle
中的下一个最高值,执行上述步骤,直到所有源按降序排序。
您是否知道'key'不必返回标量,但可以返回任何可比对象?例如,在你的情况下,它将有意义的返回元组作为第一项,最重要的属性(源),不太重要(重量)作为第二项等等。 – patrys
@patrys我不知道。 http://docs.python.org/2/library/functions.html#sorted的解释看起来很简短。我搜索了解你所指出的内容。我从下面Lennart Regebro的例子中看到,他已经显示了调用函数的关键。这对我来说是新的,现在阅读更多内容并查看示例。谢谢 –