我正在尝试对列表中的列表进行排序:每个列表包含[seq1,seq2,score]
,我想根据(seq1,seq2)的得分从最高得分到最低得分对列表L
进行排序得分,然后每个列表根据得分
L=[ ['AA', 'CG', 0],['AA', 'AA', 4], ['CG', '--', -1]]
排序列表必须是:
L=[['AA', 'AA', 4], ['AA', 'CG', 0], ['CG', '--', -1]]
排名:
['AA', 'AA', 4] has rank 1
['AA', 'CG', 0] has rank 2
['CG', '--', -1] has rank 3
我该怎么办? 我试过了:
def getKey():/* to get the score from each list*/
scorelist=score()/*this is the list L*/
return scorelist[][2]
def sort_list():
scorelist=score()
p=sorted(s, key=getKey)
return p
答案 0 :(得分:3)
您可以使用itemgetter
作为函数来获取值以对列表进行排序。
然后要获得排名,您可以使用enumerate
。
from operator import itemgetter
score_list = score()
score_list.sort(key=itemgetter(2), reversed=True) # sort list descending by third element
for i, values in enumerate(score_list):
print(values, i+1) # print values and rank
如果多个项目可以共享相同的分数,您可以使用groupby为其分配相同的分数:
from operator import itemgetter
from itertools import groupby
score_list = score()
score_list.sort(key=itemgetter(2), reversed=True)
for i, group in enumerate(groupby(score_list)):
for item in group:
print(item, i+1)
使用此代码,如果您有2个项目排名第一,下一个项目将排名第二。如果你想将它排在第三位(正如预期的那样),你可以在内循环中增加排名(并保存它的等级以便显示):
from operator import itemgetter
from itertools import groupby
score_list = score()
score_list.sort(key=itemgetter(2), reversed=True)
rank = 1 # counter for the rank
for group in groupby(score_list):
current_rank = rank # save the rank
for item in group:
print(item, current_rank)
rank += 1 # rank increment in inner loop
答案 1 :(得分:0)
您使用sorted
功能正确。 key
可以是itemgetter
,它产生第三个列表元素。在这种情况下,您需要反转生成的列表以获得所需的顺序:
>>> import operator
>>> sorted(L, key=operator.itemgetter(2), reverse=True)
[['AA', 'AA', 4], ['AA', 'CG', 0], ['CG', '--', -1]]
答案 2 :(得分:0)
试试这个:
for result in L:
result.reverse()
L.sort()
for result in L:
result.reverse()
L.reverse()
在此代码中,您可以在第一个位置设置任何列表的编号,并使用sort函数对其进行排序。从最小到最高的数字后排序列表。因此,您必须再次使用反向功能,以便将其用于排名系统