Список Python 3: как сортировать база по числу, а затем письма?

Если мой список равен [('IL', 36), ('NJ', 81), ('CA', 81), ('DC', 52), ('TX', 39)] ,

как я могу сортировать его так, чтобы мой результат был [('CA', 81), ('NJ', 81), ('DC', 52), ('TX', 39), ('IL', 36)] ?

3 Solutions collect form web for “Список Python 3: как сортировать база по числу, а затем письма?”

Довольно прямо:

 your_list.sort(key=lambda e: (-e[1], e[0])) 

например

 >>> your_list = [('IL', 36), ('NJ', 81), ('CA', 81), ('DC', 52), ('TX', 39)] >>> your_list.sort(key=lambda e: (-e[1], e[0])) >>> your_list [('CA', 81), ('NJ', 81), ('DC', 52), ('TX', 39), ('IL', 36)] 

Обратите внимание, что выше отсортировано список на месте. Если вы хотите обернуть это в функцию и не изменить исходный список, используйте sorted

 def your_sort(your_list): return sorted(your_list, key=lambda e: (-e[1], e[0])) 

Если бы у вас не было удобства быть в состоянии -somefield , то подход -somefield бы в том, чтобы делать многофазную сортировку, которая использует преимущества сорта Python, являющегося стабильной.

 a = [('IL', 36), ('NJ', 81), ('CA', 81), ('DC', 52), ('TX', 39)] from operator import itemgetter a.sort(key=itemgetter(0)) a.sort(key=itemgetter(1), reverse=True) # [('CA', 81), ('NJ', 81), ('DC', 52), ('TX', 39), ('IL', 36)] 

Сравните первый элемент, если он не равен, если он равен, сравните второй элемент. Если вы хотите в обратном порядке, переключите cmp(a, b) на cmp(b, a) .

 >>> a = [('IL', 36), ('NJ', 81), ('CA', 81), ('DC', 52), ('TX', 39)] >>> sorted(a, cmp=lambda x, y: cmp(y[1],x[1]) if x[1]!=y[1] else cmp(x[0],y[0])) [('CA', 81), ('NJ', 81), ('DC', 52), ('TX', 39), ('IL', 36)] 

Другой ответ короче, но этот подход работает, даже если один из элементов не является числовым и может расширяться для любого количества уровней, хотя вы можете написать правильную функцию сравнения вместо использования лямбда – для общего N-уровня Сортировать:

 >>> def arbitrary_level_tuple_sort(iterable, order=[(0, 'a')]): def comparator(a, b): for i, o in order: if a[i] != b[i]: if o == 'a': return cmp(a[i], b[i]) else: return cmp(b[i], a[i]) return 0 return sorted(iterable, cmp=comparator) >>> arbitrary_level_tuple_sort(a, [(1, 'd'), (0, 'a')]) [('CA', 81), ('NJ', 81), ('NJ', 81), ('TX', 39), ('IL', 36)] 

Аргумент order – это список индексов и заказов кортежей (a = возрастание / d = убывание), это работает для кортежей любого размера:

 >>> b = [tuple([random.randint(0, 10) for i in range(5)]) for i in range(5)] >>> b [(7, 5, 5, 8, 0), (0, 4, 5, 0, 7), (7, 4, 0, 9, 0), (1, 1, 3, 9, 4), (6, 2, 9, 6, 3)] 

Сортировка по 4-му элементу (индекс 3) по убыванию, затем для 5-го и первого по возрастанию:

 >>> arbitrary_level_tuple_sort(b, [(3, 'd'), (4, 'a'), (0, 'a')]) [(7, 4, 0, 9, 0), (1, 1, 3, 9, 4), (7, 5, 5, 8, 0), (6, 2, 9, 6, 3), (0, 4, 5, 0, 7)] 
  • Как вернуть определенную точку после ошибки в цикле «while»
  • Являются ли классные объекты одиночными?
  • Как шифровать и расшифровывать строку в python?
  • Как умножить список текста на список целых чисел и получить один длинный список текста?
  • sort () возвращает None
  • Python: индекс замены строки
  • Оператор «IN» с пустыми строками в Python 3.0
  • Введите многострочную строку в python
  • Python 3 диапазон поворота к списку
  • Изменения синтаксиса Python 3
  • Как программа может выбирать между двумя функциями в python?
  • Python - лучший язык программирования в мире.