Как сортировать (список/кортеж) списков/кортежей?
У меня есть некоторые данные либо в списке списков, либо в списке кортежей, например:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
и я хочу отсортировать по 2-му элементу в подмножестве. То есть, сортировка по 2,5,8, где 2-от (1,2,3), 5-от (4,5,6). Каков общий способ сделать это? Должен ли я хранить кортежи или списки в моем списке?
10 ответов:
sorted_by_second = sorted(data, key=lambda tup: tup[1])или:
data.sort(key=lambda tup: tup[1]) # sorts in place
Я просто хочу добавить к ответу Стивена, если вы хотите отсортировать массив от высокого до низкого, другой способ, отличный от приведенных выше комментариев, - просто добавить это в строку:
reverse = Trueи результат будет следующим:
data.sort(key=lambda tup: tup[1], reverse=True)
Стивен Я бы использовал. Для полноты, вот DSU (decorate-sort-undecorate) шаблон со списком понимания:
decorated = [(tup[1], tup) for tup in data] decorated.sort() undecorated = [tup for second, tup in decorated]или, более лаконично:
[b for a,b in sorted((tup[1], tup) for tup in data)]Как отмечено в Python Сортировка HowTo, это было ненужно с Python 2.4, когда стали доступны ключевые функции.
для сортировки по нескольким критериям, а именно, например, по второму и третьему элементам в кортеже, пусть
data = [(1,2,3),(1,2,1),(1,1,4)]и так определить лямбда, которая возвращает кортеж, который описывает приоритет, например
sorted(data, key=lambda tup: (tup[1],tup[2]) ) [(1, 1, 4), (1, 2, 1), (1, 2, 3)]
чтобы отсортировать список кортежей
(<word>, <count>)наcountв порядке убывания иwordв алфавитном порядке:data = [ ('betty', 1), ('bought', 1), ('a', 1), ('bit', 1), ('of', 1), ('butter', 2), ('but', 1), ('the', 1), ('was', 1), ('bitter', 1)]Я использую этот метод:
sorted(data, key=lambda tup:(-tup[1], tup[0]))и это дает мне результат:
[('butter', 2), ('a', 1), ('betty', 1), ('bit', 1), ('bitter', 1), ('bought', 1), ('but', 1), ('of', 1), ('the', 1), ('was', 1)]
@ответ Стивена-это к делу! Вот пример для лучшей визуализации,
кричите для готовых поклонников игрока один!=)
>>> gunters = [('2044-04-05', 'parzival'), ('2044-04-07', 'aech'), ('2044-04-06', 'art3mis')] >>> gunters.sort(key=lambda tup: tup[0]) >>> print gunters [('2044-04-05', 'parzival'), ('2044-04-06', 'art3mis'), ('2044-04-07', 'aech')]
key- это функция, которая будет вызываться для преобразования элементов коллекции для сравнения.. какcompareToметод в Java.параметр, передаваемый ключу, должен быть чем-то вызываемым. Здесь, использование
lambdaсоздает анонимную функцию (которая является отзывной).
Этот синтаксис лямбда-это слово лямбда, за которым следует повторяющееся имя, а затем один блок кода.ниже примера мы сортируем список кортежа, который содержит информацию о времени определенного события и имени актера.
мы сортируем этот список по времени наступления события - это 0-й элемент кортежа.
Примечание -
s.sort([cmp[, key[, reverse]]])сортирует элементы s на месте
itemgetter()несколько быстрее, чемlambda tup: tup[1], но увеличение относительно скромное (около 10 до 25 процентов).(оболочкой IPython сессии)
>>> from operator import itemgetter >>> from numpy.random import randint >>> values = randint(0, 9, 30000).reshape((10000,3)) >>> tpls = [tuple(values[i,:]) for i in range(len(values))] >>> tpls[:5] # display sample from list [(1, 0, 0), (8, 5, 5), (5, 4, 0), (5, 7, 7), (4, 2, 1)] >>> sorted(tpls[:5], key=itemgetter(1)) # example sort [(1, 0, 0), (4, 2, 1), (5, 4, 0), (8, 5, 5), (5, 7, 7)] >>> %timeit sorted(tpls, key=itemgetter(1)) 100 loops, best of 3: 4.89 ms per loop >>> %timeit sorted(tpls, key=lambda tup: tup[1]) 100 loops, best of 3: 6.39 ms per loop >>> %timeit sorted(tpls, key=(itemgetter(1,0))) 100 loops, best of 3: 16.1 ms per loop >>> %timeit sorted(tpls, key=lambda tup: (tup[1], tup[0])) 100 loops, best of 3: 17.1 ms per loop
Comments