在python中排序列表

时间:2015-03-18 13:55:03

标签: python sorting

我正在尝试对列表中的列表进行排序:每个列表包含[seq1,seq2,score],我想根据(seq1,seq2)的得分从最高得分到最低得分对列表L进行排序得分,然后每个列表根据得分

对每个(seq1,seq2)进行排名
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

3 个答案:

答案 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函数对其进行排序。从最小到最高的数字后排序列表。因此,您必须再次使用反向功能,以便将其用于排名系统