按边缘权重对图表进行排序.蟒蛇

Moh*_*hit 5 python

我有一个格式元组列表:

(node1, node2, weight)
Run Code Online (Sandbox Code Playgroud)

我想要做的是对这个元组进行排序,以便权重较高的节点位于顶部

例如

(A,B,2)
(A,C,5)
(C,A,2)
Run Code Online (Sandbox Code Playgroud)

应该给我

(A,C,5)
(A,B,2)
(C,A,2)
Run Code Online (Sandbox Code Playgroud)

第一个节点按字母顺序排序.第二个节点按重量排名降低.

mgi*_*son 9

这应该工作得很好:

lst.sort(key=lambda x:x[2], reverse=True)
Run Code Online (Sandbox Code Playgroud)

当然,我们可以通过以下方式避免lambda:

import operator
lst.sort(key=operater.itemgetter(2), reverse=True)
Run Code Online (Sandbox Code Playgroud)

如果你想对多个条件进行排序,你可以创建有趣的函数来返回元组(元组将按第一个索引排序,然后排序第二个,然后排序第三个......),或者你可以使用python的排序保证稳定的事实.因此,如果您希望列表主要按重量排序,然后按节点名称排序,则只需按节点名称排序,然后按重量排序.(向后的顺序有点反直觉).

如果我理解你的问题(在重新阅读并看到这里的一些评论之后)你可以按如下方式排序:

lst.sort(key=lambda x: (-x[2],x[0])) #relying on tuples
Run Code Online (Sandbox Code Playgroud)

对于具有相同权重的对象,这主要按重量排序(首先是高位数),然后按节点1按字母顺序排序.

请注意,这只有在您可以否定x[2]在排序中首先出现高数字时才有效(例如,它不适用于字符串).一个更可靠的方法来完成同样的事情(虽然效率较低?)将是:

lst.sort(key=lambda x: x[0])
lst.sort(key=lambda x: x[2], reversed=True)
Run Code Online (Sandbox Code Playgroud)


ste*_*eha 5

使用"键功能".由于您希望首先对大权重进行排序,因此关键函数应返回权重的负数,以便较大的权重排序较低.

A='A'
B='B'
C='C'
lst = [(A, B, 2), (A, C, 5), (C, A, 2)]

def weight_key(tup):
    return tup[0], -tup[2], tup[1]

lst.sort(key=weight_key)
print(lst)  # prints: [('A', 'C', 5), ('A', 'B', 2), ('C', 'A', 2)]
Run Code Online (Sandbox Code Playgroud)

编辑:我刚刚重新阅读了这个问题.我不确定这意味着什么:"所以,第一个节点按字母顺序排序.第二个节点按重量排名降低."

但我认为你希望关键是第一,对node1价值进行排序; 然后,按重量排序,最先排序; 然后按node2值排序.我已经编辑了关键函数来返回一个按这种方式排序的元组.