2015-03-18 5 views
-1

Я пытаюсь сортировать списки по списку: каждый список содержит [seq1,seq2,score], я хочу отсортировать список L по оценке (seq1, seq2) от максимального балла до минимального балла, затем каждый список занять ранг каждой (Seq1, SEQ2) по шкалесортировка списка в python

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

Так в чем же вопрос? –

+0

что вы пробовали? – svenhornberg

+0

Напишите код. – jonrsharpe

ответ

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 
+0

некоторые списки могут иметь одинаковую оценку, поэтому у них одинаковый рейтинг. Как я могу это сделать? – user3216969

+0

Я завершил свой ответ с помощью этой функции. –

0

Вы на правильном пути, с помощью функции sorted. key может быть itemgetter, который дает третий элемент списка. В этом случае вам необходимо обратить сгенерированный список, чтобы получить желаемый заказ:

>>> import operator 
>>> sorted(L, key=operator.itemgetter(2), reverse=True) 
[['AA', 'AA', 4], ['AA', 'CG', 0], ['CG', '--', -1]] 
+1

'cmp' отсутствует. Вместо этого используйте 'key'. – Matthias

0

Тест:

for result in L: 
    result.reverse() 
L.sort() 
for result in L: 
    result.reverse() 
L.reverse() 

В этом коде вы установите количество любого списка на первое место и сортировать его с помощью функции сортировки. После того, как вы отсортировали список от наименьшего к самому большому числу. Таким образом, вам нужно снова использовать функцию обратного вызова, чтобы вы могли использовать ее для вашей ранжированной системы.

+0

Этот ответ был бы более полезен, если бы вы объяснили, как работает код. – skrrgwasme

+0

Я добавил объяснение – Sven

Смежные вопросы