2013-07-20 64 views
1

我有以下给出的python中图形边缘的表示法,其中顶点是键,边权重是值。按值/权重对字典表示的图形边缘排序

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

我需要按重量为一个应用程序(克鲁斯卡尔算法)对边进行排序。所以鉴于字典是未分类的,我想将字典转换为如下的元组列表。

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. 是否有任何其他方法,以便我可以按重量排序边缘字典,这是一个字典值,而不是将其转换为元组列表?

回答

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是你的在这种情况下协调。

+0

感谢itemgetter http://docs.python.org/2/library/operator.html文档中的一个小问题,我看到了operator.itemgetter(* items)。 python中'*'的意思是python中没有指针,对吧? – vkaul11

+0

@ vkaul11'*'运算符用于解压参数列表。 http://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists详细解释它 – ersran9