#python #list #sequence #higher-order-functions
#python #Список #последовательность #функции более высокого порядка
Вопрос:
Скажем, есть список кортежей (или других элементов с возможностью индексации)
d = [('c', 1), ('a', 2), ('b', 3)]
это должно быть отсортировано на основе первого элемента в каждом элементе, как так
s = sorted(d, key = lambda i: i[0])
Существует ли стандартная / встроенная функция для этой «первой» операции, чтобы ее можно было записать аналогично следующему?
s = sorted(d, key = fn.first)
(Определение локальной первой функции тривиально, но мне любопытна стандартная функция, подобная operator.add
или подобная.)
Комментарии:
1. В любом случае это естественный порядок сортировки
tuple
. Разница в том, что когда первый элемент сравнивается равным, сравнение переходит ко второму элементу и так далее.2. @gnibbler Хороший момент. Я просто думал о равенстве, а не о порядке.
Ответ №1:
Используйте itemgetter из модуля operator.
from operator import itemgetter
s = sorted(d, key=itemgetter(0))
Кроме того, вы могли бы создать свой собственный first
оператор.
first = itemgetter(0)
s = sorted(d, key=first)
Комментарии:
1. Ах, умно. Я упустил это из виду.
2. Это более эффективно, чем лямбда-функция.
3. Помимо оптимизации, по каким причинам вы когда-либо хотели бы использовать itemgetter?
lambda i: i[0]
не требует никакого импорта и является более кратким.4. @whereswalden: в основном из-за оптимизации.