Сортировка списка кортежей по 2-му элементу (целочисленное значение) [дубликат]
этот вопрос уже есть ответ здесь:
У меня есть список кортежей, который выглядит примерно так:
[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
Я хочу отсортировать этот список в порядке возрастания по целому значению внутри кортежей. Возможно ли это?
9 ответов:
попробуйте использовать
keyключевое словоsorted().sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda x: x[1])
keyдолжна быть функция, которая определяет, как получить сопоставимый элемент из структуры данных. В вашем случае это второй элемент кортежа, поэтому мы получаем доступ[1].для оптимизации, см. ответ jamylak с помощью
itemgetter(1), который по существу является более быстрой версиейlambda x: x[1].
>>> 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)]ИМО с помощью
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
добавление к ответу Чикена, Вот как вы сортируете список кортежей по 2-му элементу в нисходящем порядке.
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
как неофит python, я просто хотел упомянуть, что если данные действительно выглядят так:
data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]затем
sorted()автоматически сортируется по второму элементу кортежа, так как все первые элементы идентичны.
из python wiki:
>>> from operator import itemgetter, attrgetter >>> sorted(student_tuples, key=itemgetter(2)) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>> sorted(student_objects, key=attrgetter('age')) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
для метода, избегающего лямбда, сначала определите свою собственную функцию:
def MyFn(a): return a[1]затем:
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)
для сортировки на месте используйте
foo = [(list of tuples)] foo.sort(key=lambda x:x[0]) #To sort by first element of the tuple
на
Python 2.7+, это работает, что делает принятый ответ немного более читаемым:sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)
тот факт, что значения сортировки в OP являются целыми числами, не имеет отношения к вопросу как таковому. Другими словами, принятый ответ будет работать, если значение сортировки-текст. Я довожу это до того, чтобы также указать, что сортировка может быть изменена во время сортировки (например, для учета верхнего и нижнего регистра).
>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: x[1]) [(148, 'ABC'), (221, 'DEF'), (121, 'abc'), (231, 'def')] >>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: str.lower(x[1])) [(121, 'abc'), (148, 'ABC'), (231, 'def'), (221, 'DEF')]
Comments