Python: как отсортировать сложный список по двум разным ключам - PullRequest
11 голосов
/ 20 октября 2010

У меня странный список, построенный следующим образом:

[[name_d, 5], [name_e, 10], [name_a, 5]] 

и я хочу отсортировать его сначала по номеру (desc), а затем, если число совпадает, по имени (asc). Итак, результат, который я хотел бы получить:

[[name_e, 10], [name_a, 5], [name_d, 5]]

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

Ответы [ 4 ]

25 голосов
/ 20 октября 2010

Функции сортировки в python позволяют передавать функцию в качестве ключа сортировки:

l = [[name_d, 5], [name_e, 10], [name_a, 5]]
# copy
l_sorted = sorted(l, key=lambda x: (x[1] * -1, x[0]))
# in place
l.sort(key=lambda x: (x[1] * -1, x[0]))

Правки:
1. Порядок сортировки
2.Демонстрация копирования и сортировки по месту

0 голосов
/ 29 ноября 2016

Вы можете отсортировать список дважды, чтобы получить результат, просто поменяйте местами порядок:

import operator

l = [[name_d, 5], [name_e, 10], [name_a, 5]]

l.sort(operator.itemgetter(1))
l.sort(operator.itemgetter(0), reverse=True)

Тогда вы получите отсортированный список, как и ожидалось.

0 голосов
/ 21 мая 2012

Вот кое-что, что я подхватил (для решения той же проблемы).Я только проверил это с моими последними версиями установленного Python (OS X).Ниже представлены импортируемые части (с недовольным именем): sortKeyWithTwoListOrders и sortKeyWith2ndThen1stListValue


#Tested under Python 2.7.1 & Python 3.2.3:

import random # Just to shuffle for demo purposes

# Our two lists to sort
firstCol=['abc','ghi','jkl','mno','bcd','hjk']
secondCol=[5,4,2,1]

# Build 2 dimensional list [[firstCol,secondCol]...]
myList = []
for firstInd in range(0, len(firstCol)):
  for secondInd in range(0, len(secondCol)):
    myList = myList + [[firstCol[firstInd],secondCol[secondInd]]]

random.shuffle(myList)

print ("myList (shuffled):")
for i in range(0,len(myList)):
  print (myList[i])

def sortKeyWithTwoListOrders(item):
  return secondCol.index(item[1]), firstCol.index(item[0])

myList.sort(key=sortKeyWithTwoListOrders)
print ("myList (sorted according to strict list order, second column then first column):")
for i in range(0,len(myList)):
  print (myList[i])

random.shuffle(myList)

print ("myList (shuffled again):")
for i in range(0,len(myList)):
  print (myList[i])

def sortKeyWith2ndThen1stListValue(item):
  return item[1], item[0]

myList.sort(key=sortKeyWith2ndThen1stListValue)
print ("myList (sorted according to *values*, second column then first column):")
for i in range(0,len(myList)):
  print (myList[i])

myList (shuffled):
['ghi', 5]
['abc', 2]
['abc', 1]
['abc', 4]
['hjk', 5]
['bcd', 4]
['jkl', 5]
['jkl', 2]
['bcd', 1]
['ghi', 1]
['mno', 5]
['ghi', 2]
['hjk', 2]
['jkl', 4]
['mno', 4]
['bcd', 2]
['bcd', 5]
['ghi', 4]
['hjk', 4]
['mno', 2]
['abc', 5]
['mno', 1]
['hjk', 1]
['jkl', 1]
myList (sorted according to strict list order, second column then first column):
['abc', 5]
['ghi', 5]
['jkl', 5]
['mno', 5]
['bcd', 5]
['hjk', 5]
['abc', 4]
['ghi', 4]
['jkl', 4]
['mno', 4]
['bcd', 4]
['hjk', 4]
['abc', 2]
['ghi', 2]
['jkl', 2]
['mno', 2]
['bcd', 2]
['hjk', 2]
['abc', 1]
['ghi', 1]
['jkl', 1]
['mno', 1]
['bcd', 1]
['hjk', 1]
myList (shuffled again):
['hjk', 4]
['ghi', 1]
['abc', 5]
['bcd', 5]
['ghi', 4]
['mno', 1]
['jkl', 1]
['abc', 1]
['hjk', 1]
['jkl', 2]
['hjk', 5]
['mno', 2]
['jkl', 4]
['ghi', 5]
['bcd', 1]
['bcd', 2]
['jkl', 5]
['abc', 2]
['hjk', 2]
['abc', 4]
['mno', 4]
['mno', 5]
['bcd', 4]
['ghi', 2]
myList (sorted according to *values*, second column then first column):
['abc', 1]
['bcd', 1]
['ghi', 1]
['hjk', 1]
['jkl', 1]
['mno', 1]
['abc', 2]
['bcd', 2]
['ghi', 2]
['hjk', 2]
['jkl', 2]
['mno', 2]
['abc', 4]
['bcd', 4]
['ghi', 4]
['hjk', 4]
['jkl', 4]
['mno', 4]
['abc', 5]
['bcd', 5]
['ghi', 5]
['hjk', 5]
['jkl', 5]
['mno', 5]
0 голосов
/ 20 октября 2010

Это не должна быть лямбда-функция, которую вы передаете методу sort, вы можете фактически предоставить реальную функцию, поскольку они являются первоклассными объектами в python.

L.sort(my_comparison_function)

Должно работать нормально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...