В вашем случае решение Мартейн Питерс, вероятно, лучше, но я рассматриваю то, что вы могли бы сделать, если вам необходимо сделать это для любого числа параметров, и необходимо сделать некоторые восходящий и некоторый нисходящий.
Этот подход создает функцию для генерации индекса сортировки на лету. Вызов функции getsortfunction со списком кортежей для сортировки и список, содержащий индексы, и если они должны быть в обратном порядке (например, (2,True)
означает второй индекс в обратном порядке), возвращает функцию, которая создает индекс сортировки для объекта. Это довольно уродливый, но универсален.
def getsortfunction(values,indices):
sorts = [sorted(list(set(x[indices[i][0]] for x in values)),reverse=indices[i][1]) for i in range(len(indices))]
def sortfunction(y):
return tuple(sorts[i].index(y[indices[i][0]]) for i in range(len(indices)))
return sortfunction
Примеров
a = [('Pineapple',1),('Orange',3),('Banana',1),('Apple',1),('Cherry',2)]
# sort a by index 1 first (in reverse order) and then by index 0 in non-reverse order
b = sorted(a,key=getsortfunction(a,[(1,True),(0,False)])) # gives desired list
с дополнительными критериями
c = [('Pineapple',1,'Hawaii'),('Orange',3,'Florida'),('Banana',1,'Hawaii'),('Apple',1,'Washington'),('Cherry',2,'Washington')]
# sort first by number (in reverse order) then by state, and finally by fruit
d = sorted(c,key=getsortfunction(c,[(1,True),(2,False),(0,False)]))
# sort c first by number (in reverse order), then by fruit, ignoring state
e = sorted(c,key=getsortfunction(c,[(1,True),(0,False)]))
getsortfunction первым строит вложенный список уникальных значений в порядке и возвращает функцию, которая отображает каждое значение, чтобы быть отсортированы по числовой кортеж, указывающий свои индексы в списке отсортированных значений.
Самое большое преимущество этого заключается в том, что вы можете определить критерии сортировки во время выполнения (например, из пользовательских запросов).
На самом деле вы можете просто сделать: 'top_n.sort(); top_n.sort (key = itemgetter (1), reverse = True) '. Потому что 'reverse = False' является значением по умолчанию. Также использование 'itemgetter (0)' на самом деле не имеет особого смысла, поскольку последовательности уже отсортированы первым элементом, поэтому вы можете просто избегать использования 'key'. – Bakuriu
@ Бакуриу: Да! Правда. Спасибо за предложение. –