Вопрос-Ответ

Sort a list of tuples by 2nd item (integer value) [duplicate]

Сортировка списка кортежей по 2-му элементу (целочисленному значению)

У меня есть список кортежей, который выглядит примерно так:

[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]

Я хочу отсортировать этот список в порядке возрастания по целочисленному значению внутри кортежей. Возможно ли это?

Переведено автоматически
Ответ 1

Попробуйте использовать key аргумент ключевого слова в sorted(), который по умолчанию выполняет сортировку в порядке возрастания:

sorted(
[('abc', 121), ('abc', 231), ('abc', 148), ('abc', 221)],
key=lambda x: x[1]
)

key должна быть функция, которая определяет, как извлечь сопоставимый элемент из вашей структуры данных. В вашем случае это второй элемент кортежа, к которому мы обращаемся [1].

Для оптимизации смотрите Ответ джамиляка с использованием operator.itemgetter(1), который по сути является более быстрой версией lambda x: x[1].

Ответ 2
>>> from operator import itemgetter
>>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
>>> sorted(data,key=itemgetter(1))
[('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]

IMO с использованием itemgetter в этом случае более удобочитаемо, чем решение от @cheeken. Это
также быстрее, поскольку почти все вычисления будут выполняться на c стороне (без каламбура), а не с помощью lambda.

>python -m timeit -s "from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=itemgetter(1))"
1000000 loops, best of 3: 1.22 usec per loop

>python -m timeit -s "data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=lambda x: x[1])"
1000000 loops, best of 3: 1.4 usec per loop
Ответ 3

Добавляя к ответу Чикена, вот как вы сортируете список кортежей по 2-му элементу в порядке убывания.

sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
Ответ 4

Как новичок в python, я просто хотел упомянуть, что если данные действительно выглядят так:

data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]

тогда sorted() будет выполняться автоматическая сортировка по второму элементу в кортеже, поскольку все первые элементы идентичны.

python list