Существует ли функция «получить первый элемент» для использования в функциях более высокого порядка?

#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: в основном из-за оптимизации.