У меня есть список списков:
[[12, 'tall', 'blue', 1],
[2, 'short', 'red', 9],
[4, 'tall', 'blue', 13]]
Если бы я хотел отсортировать по одному элементу, скажем, высокому / короткому элементу, я мог бы сделать это с помощью s = sorted(s, key = itemgetter(1))
.
Если бы я захотел отсортировать как по высокому / короткому, так и по цвету, я мог бы выполнить сортировку дважды, по одному разу для каждого элемента, но есть ли более быстрый способ?
sort
. То естьsorted([(4, 2), (0, 3), (0, 1)]) == [(0, 1), (0, 3), (4, 2)]
.Ответы:
Ключ может быть функцией, которая возвращает кортеж:
Или вы можете добиться того же, используя
itemgetter
(что быстрее и позволяет избежать вызова функции Python):И обратите внимание, что здесь вы можете использовать
sort
вместо использования,sorted
а затем переназначить:источник
-
целых чисел)revrse=True
только наx[1]
это возможно?s = sorted(s, key = operator.itemgetter(2))
затем по первичному.s = sorted(s, key = operator.itemgetter(1), reverse=True)
Не идеально, но работает.-1
.Я не уверен, что это самый питонический метод ... У меня был список кортежей, которым нужно было отсортировать 1-е место по убыванию целочисленных значений и 2-е по алфавиту. Это потребовало реверсирования целочисленной сортировки, но не алфавитной сортировки. Вот мое решение: (кстати, на лету на экзамене, я даже не знал, что вы можете «вкладывать» отсортированные функции)
источник
b = sorted(a, key = lambda x: (-x[1], x[0]))
который более очевиден в отношении критериев, применяемых в первую очередь. Что касается эффективности, я не уверен, кому-то нужно время.Несколько лет опоздал на вечеринку, но я хочу как отсортировать по двум критериям, так и использовать
reverse=True
. Если кто-то еще хочет знать, как, вы можете заключить свои критерии (функции) в круглые скобки:источник
Похоже, вы могли бы использовать
list
вместоtuple
. Это становится более важным, я думаю, когда вы захватываете атрибуты вместо «магических индексов» списка / кортежа.В моем случае я хотел отсортировать по нескольким атрибутам класса, где входящие ключи были строками. Мне требовалась различная сортировка в разных местах, и я хотел общую сортировку по умолчанию для родительского класса, с которым взаимодействовали клиенты; только необходимость переопределять «ключи сортировки», когда мне действительно «нужно», но и таким образом, чтобы я мог хранить их в виде списков, которые класс мог бы разделить
Итак, сначала я определил вспомогательный метод
затем использовать его
Это будет использовать сгенерированную лямбда-функцию для сортировки списка,
object.attrA
а затемobject.attrB
при условии, чтоobject
есть получатель, соответствующий предоставленным именам строк. И второй случай будет сортировать к томуobject.attrC
времениobject.attrA
.Это также позволяет вам потенциально представлять варианты внешней сортировки для совместного использования потребителем, модульным тестом или для них, чтобы, возможно, сказать вам, как они хотят, чтобы сортировка выполнялась для какой-либо операции в вашем API, только для того, чтобы дать вам список, а не связывая их с вашей серверной реализацией.
источник
Вот один из способов: вы в основном переписываете свою функцию сортировки, чтобы получить список функций сортировки, каждая функция сортировки сравнивает атрибуты, которые вы хотите протестировать, при каждом тесте сортировки вы смотрите и видите, возвращает ли функция cmp ненулевой возврат если так, сломайте и отправьте возвращаемое значение. Вы вызываете это, вызывая лямбду-функцию из списка лямбда-выражений.
Его преимущество заключается в том, что он выполняет однократный проход через данные, а не в виде предыдущего вида, как это делают другие методы. Другое дело, что сортировка происходит на месте, тогда как сортировка, похоже, делает копию.
Я использовал его для написания функции ранжирования, которая ранжирует список классов, где каждый объект находится в группе и имеет функцию оценки, но вы можете добавить любой список атрибутов. Обратите внимание на не лямбда-подобное, хотя и хакерское использование лямбды для вызова сеттера. Часть ранга не будет работать для массива списков, но сортировка будет.
Вот способ ранжировать список объектов
источник