Сортировка кортежа, содержащего списки - PullRequest
0 голосов
/ 27 мая 2009

У меня есть вопрос, похожий на этот , но вместо этого мой кортеж содержит списки следующим образом:

mytuple = (
 ["tomato", 3],
 ["say", 2],
 ["say", 5],
 ["I", 4],
 ["you", 1],
 ["tomato", 6],
)

Какой самый эффективный способ сортировки?

Ответы [ 4 ]

7 голосов
/ 27 мая 2009

Вы можете легко получить отсортированный кортеж:

>>> sorted(mytuple)
[['I', 4], ['say', 2], ['say', 5], ['tomato', 3], ['tomato', 6], ['you', 1]]

Это будет сортировать на основе элементов в списке. Если первые два совпадают, сравниваются вторые и т. Д.

Если у вас есть другие критерии, вы можете предоставить функцию сравнения.

Обновлено: Как отметил комментатор, возвращается список. Вы можете получить еще один кортеж, например, так:

>>> tuple(sorted(mytuple))
(['I', 4], ['say', 2], ['say', 5], ['tomato', 3], ['tomato', 6], ['you', 1])
5 голосов
/ 27 мая 2009

Вы не можете отсортировать кортеж.

Что вы можете сделать, это использовать sorted () , который не будет сортировать кортеж, но создаст отсортированный список из вашего кортежа. Если вам действительно нужен отсортированный кортеж, вы можете затем преобразовать результат из отсортированного кортежа:

mytuple = tuple(sorted(mytuple, key=lambda row: row[1]))

Это может быть пустой тратой памяти, поскольку вы создаете список, а затем отбрасываете его (а также отбрасываете исходный кортеж). Скорее всего, вам не нужен кортеж. Гораздо эффективнее было бы начать со списка и отсортировать его.

1 голос
/ 27 мая 2009

Техника, использованная в принятом ответе на этот вопрос (sorted(..., key=itemgetter(...))), должна работать с любой итерацией такого типа Основываясь на данных, представленных здесь, я думаю, что точное решение, представленное здесь, - это то, что вы хотите.

1 голос
/ 27 мая 2009

К сожалению, вам придется создать новый кортеж: что-то вроде

mytuple = sorted(mytuple)

должен сделать свое дело. sorted не вернет кортеж. оберните вызов в tuple(), если вам это нужно. Это может быть дорогостоящим, если набор данных длинный.

Если вам нужно установить второй элемент в подсписках, вы можете использовать параметр key для функции sorted. Для этого вам понадобится вспомогательная функция:

mytuple = sorted(mytuple, key=lambda row: row[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...