Как Python сортирует список кортежей? - PullRequest
56 голосов
/ 13 марта 2009

Опытным путем кажется, что сортировщик списка по умолчанию в Python при передаче списка кортежей будет сортировать по первому элементу в каждом кортеже. Это верно? Если нет, то как правильно отсортировать список кортежей по первым элементам?

Ответы [ 5 ]

74 голосов
/ 13 марта 2009

Он автоматически сортирует список кортежей по первым элементам в кортежах, затем по вторым элементам и т. Д. Кортеж ([1,2,3]) будет идти до кортежа ([1,2,4]). Если вы хотите переопределить это поведение, передайте вызываемый метод в качестве второго аргумента в метод сортировки. Этот вызываемый объект должен возвращать 1, -1, 0.

8 голосов
/ 13 марта 2009

Да, это по умолчанию. Фактически, это основа классической идиомы "DSU" (Decorate-Sort-Undecorate) в Python. См. Код, как у Pythonista .

5 голосов
/ 13 марта 2009

Нет, кортежи имеют типы последовательностей , как и строки. Они сортируются одинаково, сравнивая каждый элемент по очереди:

>>> import random
>>> sorted([(0,0,0,int(random.getrandbits(4))) for x in xrange(10)])
[(0, 0, 0, 0), (0, 0, 0, 4), (0, 0, 0, 5), (0, 0, 0, 7), (0, 0, 0, 8),
(0, 0, 0, 9), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 14)]

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

1 голос
/ 13 марта 2009

Попробуйте использовать метод сортировки внутреннего списка и передайте лямбду. Если первым элементом вашего кортежа является целое число, это должно сработать.

# l is the list of tuples
l.sort(lambda x,y: x-y)

Вы можете использовать любой вызываемый для функции сравнения, не обязательно лямбда. Однако он должен возвращать -1 (меньше), 0 (равно) или 1 (больше).

0 голосов
/ 13 марта 2009

Ознакомьтесь с ответом «Девин Жанпьер» на этот вопрос. sort-a-dictionary-in-python-by-the-value , где он говорит использовать кортеж и показывает, как сортировать по второму значению

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...