Сортировка кортежей по второму параметру


93

У меня есть список кортежей, которые выглядят примерно так:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

Я хочу получить список, отсортированный в порядке возрастания по второму значению кортежа. Итак, L [0] должно быть ("Person 2", 8)после сортировки.

Как я могу это сделать? Использование Python 3.2.2 Если это поможет.


Ответы:


187

Вы можете использовать keyпараметр для list.sort():

my_list.sort(key=lambda x: x[1])

или, немного быстрее,

my_list.sort(key=operator.itemgetter(1))

(Как и в случае с любым другим модулем, вам необходимо import operatorиметь возможность его использовать.)


3
Я пробовал использовать L.sort(key=operator.itemgetter(1))в своем коде, но получаю ошибку NameError, этот «оператор» не определен. Мне нужно импортировать что-нибудь особенное?
user974703

3
Немного поискал, нужно использовать import operatorдля использования функции. Если вы добавите это к своему ответу, я отмечу, что он принят.
user974703

Тестирование с помощью timeit.timeit (параметры по умолчанию) между этими двумя подходами нет большой разницы: operator.itemgetter = 1,05 мкс, лямбда = 1,25 мкс на итерацию
Ноэль Эванс

Спасибо за решение my_list.sort (key = operator.itemgetter (1)) !! :)
aman_novice

1
Если вы новичок в ключевом слове лямбда: stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx

12

А если вы используете python 3.X, вы можете применить sortedфункцию в mylist. Это просто дополнение к ответу, который @Sven Marnach дал выше.

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

Это просто встроенная функция, которая возвращает новый список. Ваш ответ ничего не добавляет к тем, что уже здесь, поскольку ясно, что если вам нужен новый список, вы бы использовали sortedвместо list.sort.
miradulo 05

2
@SamuelNde Я прокрутил здесь, потому что не был уверен, работает ли выражение так же для сортировки, поэтому мне это помогло.
Red Riding Hood

Да, согласен, мне это тоже помогло
StackG

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

вывод -> Rogue One


Пара мыслей: это фактически не отвечает на вопрос (как получить список, отсортированный по значению в кортеже); Вы можете распаковать кортеж прямо в вашем цикле (для фильма значение в listoftuples :); вы переопределили тип "кортеж"; И на самом деле это может быть сделано с помощью единого понимания списка: (return sorted ((value, movie) for movie, value in listoftuples) [- 1] [1])
RFox

Я ценю то, что вы собираетесь делать, но я бы сказал, что ему не хватает элегантности и его можно улучшить. Обычно такое преобразование порядка элементов в кортеже считается плохой практикой. Я думаю, что вопросы о понимании списков и распаковке тупплей останутся в силе. И я бы отговорил любого, кто использует эту методологию, вместо принятого ответа.
RFox

Я неспособен и не могу получить опубликованный вами код для работы, скорее всего, из-за ошибки пользователя
Даррелл Уайт

но немного изменил его, и, без сомнения, ваш ответ в 200 раз лучше.
Даррелл Уайт

def findMaxSales (listoftuples): newlist = sorted ((value, movies) для фильмов, значение в listoftuples) return newlist [-1] [1] movieList = [("В поисках Дори", 486), ("Captain America: Civil War », 408), (« Дэдпул », 363), (« Зверополис », 341), (« Изгой-один », 529), (« Тайная жизнь домашних животных », 368), (« Бэтмен против Супермена », 330 ), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] print (findMaxSales (movieList))
Даррелл Уайт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.