根据其他结果对数据进行排名

时间:2020-08-31 10:43:49

标签: python sorting ranking

在下面的代码中,我有两组数据被链接在一起-5个“网络”和5个通过“ TT”值的奇异结果。每个TT值对应一个网络集(例如TT1 = 100是来自network1的结果)。

我的目标是能够根据TT结果对5个网络进行排名。

network1 = [0,1,0,0,0,0,1,0,0,0,1,1,0,0,1]
network2 = [0,1,0,0,0,0,0,0,1,0,1,1,0,0,1]
network3 = [0,1,0,0,0,0,0,1,0,0,1,1,0,0,1]
network4 = [0,1,0,0,0,0,0,0,0,0,1,1,0,1,1]
network5 = [0,1,1,0,0,0,0,0,0,0,1,1,0,0,1]

networks = [network1, network2, network3, network4, network5]

TT1 = 100
TT2 = 70
TT3 = 80
TT4 = 105
TT5 = 120

TTranks = [TT1,TT2,TT3,TT4,TT5]

s = {x: i for i, x in enumerate(sorted(set(TTranks)))}
ranks = [s[x] for x in TTranks] 
print(ranks) 

此过程的以下结果仅排名TT值,尽管我不确定如何链接它,以便对相应的网络也进行适当排名。

[2, 0, 1, 3, 4]

也就是说,我希望对5个网络进行排名,分别为network2,network3,network1,network4,network5。 这将非常有用,因为我希望以后可以从有序的网络结果中致电。

此外,还有一种更有效的方法来完成此过程吗?

感谢所有帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用key / sort函数的sorted可选参数来根据自定义值进行排序。

代码

network1 = [0,1,0,0,0,0,1,0,0,0,1,1,0,0,1]
network2 = [0,1,0,0,0,0,0,0,1,0,1,1,0,0,1]
network3 = [0,1,0,0,0,0,0,1,0,0,1,1,0,0,1]
network4 = [0,1,0,0,0,0,0,0,0,0,1,1,0,1,1]
network5 = [0,1,1,0,0,0,0,0,0,0,1,1,0,0,1]

networks = [network1, network2, network3, network4, network5]

TT1 = 100
TT2 = 70
TT3 = 80
TT4 = 105
TT5 = 120

TT = [TT1, TT2, TT3, TT4, TT5]

sorted_networks_with_indices = sorted(enumerate(networks), key=lambda t: TT[t[0]])

sorted_indices = [i for i,n in sorted_networks_with_indices]
sorted_networks = [n for i,n in sorted_networks_with_indices]

print(sorted_indices)
print(sorted_networks)

输出:

[1, 2, 0, 3, 4]
[[0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1],
 [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1],
 [0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1],
 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1],
 [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]]

代码说明

enumerate(networks)列出对i,n,其中i是索引,n是网络。这些对使用sorted函数进行排序,用于排序的键为lambda t: TT[t[0]]。这里t是对i,n,因此t[0]是索引i。因此,TT[t[0]]是对应于索引网络对t的TT。

关于0索引的注意事项

sorted_indices中的索引是[1, 2, 0, 3, 4]而不是[2, 3, 1, 4, 5],因为python列表是0索引的,但这对应于network2,network3,network1,network4,network5。如果您不满意,可以将相关行替换为:

sorted_indices = [i+1 for i,n in sorted_networks_with_indices]

参考文献

答案 1 :(得分:0)

您能否解释一下网络和TTrank的连接方式?该代码显示对这两个没有依赖性。

您只是想要索引来排序TTrank?然后,您应该避免使用set(TTranks),因为定单不会保留在集中,所以重复项也会被删除。有几种获取排序索引的方法,我更喜欢numpy的argsort:

import numpy as np
print(np.argsort(TTranks)) 
# [1 2 0 3 4]