У меня есть некоторые данные в списке списков или в списке кортежей, например:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
И я хочу отсортировать по 2-му элементу в подмножестве. Значение, сортировка по 2,5,8 , где 2
находится с (1,2,3)
, 5
от (4,5,6)
. Каков общий способ сделать это? Должен ли я хранить кортежи или списки в моем списке?
Ответы:
или:
источник
key=itemgetter(1)
и в начале файла:from operator import itemgetter
sort
вот методList
объекта Python, который получает лямбда-функцию в качествеkey
параметра. Вы можете назвать это какtup
, илиt
, или как угодно, и это все равно будет работать.tup
Здесь указывается индекс кортежа списка, что1
означает, что сортировка будет выполняться по вторым значениям кортежей из исходного списка (2, 5, 8
).lambda
подход проще, чем интуитивныйitemgetter
класс,itemgetter
он действительно быстрее . Мне любопытно, почему это так. Мое грубое подозрение состоит в том,lambda
что скрытая стоимость захвата всех локальных переменных в контекст замыкания влечет за собой скрытые издержки, в то время какitemgetter
экземпляр этого не делает. tl; dr: всегда используйтеitemgetter
, потому что скорость побеждает.источник
itemgetter
класс для сортировки 126% быстрее , чем в среднем эквивалентнойlambda
функции.data.sort(key=itemgetter(3,1))
Я просто хочу добавить к ответу Стивена, если вы хотите отсортировать массив от высокого к низкому, другой способ, кроме как в комментариях выше, просто добавить это в строку:
и результат будет следующим:
источник
Для сортировки по нескольким критериям, а именно, например, по второму и третьему элементам в кортеже,
и таким образом определить лямбду, которая возвращает кортеж, который описывает приоритет, например
источник
Ответ Стивена - тот, который я бы использовал. Для полноты вот шаблон DSU (decorate-sort-undecorate) со списками:
Или, более кратко:
Как отмечено в Python Sorting HowTo , это было ненужным со времен Python 2.4, когда стали доступны ключевые функции.
источник
Чтобы отсортировать список кортежей
(<word>, <count>)
, поcount
убыванию иword
по алфавиту:Я использую этот метод:
и это дает мне результат:
источник
Без лямбды
источник
itemgetter()
несколько быстрее, чемlambda tup: tup[1]
, но увеличение является относительно скромным (около 10-25 процентов).(Сессия IPython)
источник
Ответ @Stephen к сути! Вот пример для лучшей визуализации,
Привет фанатам Ready Player One! знак равно
key
это функция, которая будет вызываться для преобразования элементов коллекции для сравнения .. какcompareTo
метод в Java.Параметр, передаваемый ключу, должен быть вызываемым. Здесь использование
lambda
создает анонимную функцию (которая вызывается).Синтаксис лямбды - это слово лямбда, за которым следует повторяемое имя, а затем отдельный блок кода.
Ниже приведен пример сортировки списка кортежей, который содержит информацию о времени определенного события и имени актера.
Мы сортируем этот список по времени возникновения события, которое является 0-м элементом кортежа.
Примечание -
s.sort([cmp[, key[, reverse]]])
сортирует элементы s на местеисточник
Сортировать кортеж довольно просто:
источник