Сортування кортежів на основі другого параметра


94

У мене є список кортежів, які виглядають приблизно так:

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

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

Як я можу це зробити? Використання Python 3.2.2 Якщо це допомагає.


Відповіді:


188

Параметр можна використовувати 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функцію в списку. Це лише доповнення до відповіді, яку @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

2
@SamuelNde Я прокрутив сюди вниз, бо не був впевнений, що вираз працює однаково для відсортованого, тому це мені допомогло.
Червона Шапочка

Так, погодився, це мені теж допомогло
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))

вихід -> Негідник один


Кілька думок: Це насправді не відповідає на запитання (як отримати список, відсортований за значенням у кортежі); Ви можете розпакувати кортеж безпосередньо у вашому циклі (для фільму, значення у listoftuples:); ви перевизначили тип "кортеж"; І насправді це можна зробити за допомогою одного розуміння списку: (повернення відсортованого ((значення, фільм) для фільму, значення у списках) [- 1] [1])
RFox

Я ціную те, на що ви йдете, але я стверджую, що йому бракує елегантності і його можна вдосконалити. Як правило, вважається поганою практикою трансформувати порядок елементів у такій сукупності. Думаю, пункти щодо розуміння списку та розпакування місць все ще стоять. І я б перешкоджав кожному, хто використовує цю методологію, прийняту відповідь.
RFox

Я не в змозі і не можу запрацювати код, який ви опублікували, швидше за все, помилка користувача
Даррелл Уайт

але трохи змінив і, без сумніву, ваша відповідь у 200 разів краща.
Даррелл Уайт

def findMaxSales (listoftuples): newlist = сортується ((значення, фільми) для фільмів, значення в listoftuples) повертає новий список [-1] [1] movieList = [("Пошук Дорі", 486), ("Капітан Америка: Громадянська війна ", 408), (" Deadpool ", 363), (" Zootopia ", 341), (" Rogue One ", 529), (" The Secret Life of Pets ", 368), (" Batman v Superman ", 330 ), ("Співай", 268), ("Загін самогубців", 325), ("Книга джунглів", 364)] друк (findMaxSales (movieList))
Даррелл Уайт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.