0

我正在使用 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_dictsource_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 度)的源对与哪个目的地。

所以我们会

  1. 首先参考source_dict_angle知道哪个是最高值。在这个给定的示例中,角度为 180 度的源 4 具有最高值,即 21

  2. 我们将 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 对元组之间的顺序不是问题。

  3. 完成此操作后,我们将在执行上述步骤时转到下一个最高值,source_dict_angle直到所有源都按降序排序。

4

1 回答 1

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

您的排序问题现在很简单。

于 2013-01-09T17:50:35.463 回答