按值/重量对字典表示的图形边缘进行排序

时间:2013-07-20 14:28:31

标签: python graph

我在python中有以下给定的Graph Edges表示,其中顶点是键,边权重是值。

Edges = {(1,2):8.3 , (2,3): 4, (3,1):6}

我需要为一个应用程序按重量对边缘进行排序(Kruskal的算法)。因此,鉴于字典未排序,我想将Dictionary转换为元组列表,如下所示。

  Edges_List = [(1,2,8.3), (2,3,4), (3,1,6)] 

这些可以通过元组的第三个元素作为键进行排序。我用过这个

 Edges_list = [(k,v) for k,v in Edges.items()] 

但我得到了一个嵌套元组。

 Edges_List = [((1,2),8.3), ((2,3),4), ((3,1),6)]

我有两个问题:

  1. 如何创建一个三元组而不是我上面的嵌套元组?
  2. 是否有其他方法可以按重量对Edges字典进行排序,除了将其转换为元组列表之外,这是一个字典值?

1 个答案:

答案 0 :(得分:0)

使用元组解包如下

>>> import operator
>>> Edges = {(1,2):8.3 , (2,3): 4, (3,1):6}
>>> Edges_list = [(k1,k2,v) for (k1,k2),v in Edges.items() ]
>>> Edges_list
[(1, 2, 8.3), (3, 1, 6), (2, 3, 4)]
>>> Edges_list.sort(key=operator.itemgetter(2))
>>> Edges_list
[(2, 3, 4), (3, 1, 6), (1, 2, 8.3)]

如果您希望将循环中的已排序元素与您的字典本身一起使用,则可以使用此

>>> for k,v in sorted(Edges, key=Edges.get):
...     # do stuff with edges

请注意,在这种情况下,kv是您的坐标。