Urutkan tupel berdasarkan parameter kedua


93

Saya memiliki daftar tupel yang terlihat seperti ini:

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

Yang ingin saya hasilkan, adalah daftar yang diurutkan dalam urutan menaik, berdasarkan nilai kedua tupel. Jadi L [0] harus ("Person 2", 8)setelah penyortiran.

Bagaimana saya bisa melakukan ini? Menggunakan Python 3.2.2 Jika itu membantu.


1
kemungkinan duplikat Sortir tupel yang berisi tupel
JBernardo

Jawaban:


187

Anda dapat menggunakan keyparameter untuk list.sort():

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

atau, sedikit lebih cepat,

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

(Seperti modul apa pun, Anda harus import operatordapat menggunakannya.)


3
Saya sudah mencoba menggunakan L.sort(key=operator.itemgetter(1))kode saya, tetapi saya mendapatkan NameError, 'operator' itu tidak ditentukan. Apakah saya perlu mengimpor sesuatu yang khusus?
pengguna974703

3
Melakukan sedikit pencarian, perlu import operatormenggunakan fungsi tersebut. Jika Anda menambahkan itu ke jawaban Anda, saya akan menandainya diterima.
pengguna974703

Menguji dengan timeit.timeit (opsi default) tidak ada perbedaan besar antara dua pendekatan ini: operator.itemgetter = 1.05µs, lambda = 1.25µs per iterasi
Noel Evans

Terima kasih atas solusi my_list.sort (key = operator.itemgetter (1)) !! :)
aman_novice

1
Jika Anda baru
mengenal

12

Dan jika Anda menggunakan python 3.X, Anda dapat menerapkan sortedfungsinya di mylist. Ini hanyalah tambahan dari jawaban yang telah diberikan oleh Marnach di atas.

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

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

Ini hanya built-in yang mengembalikan daftar baru. Jawaban Anda tidak memberikan kontribusi apa-apa dengan yang sudah ada di sini, karena jelas bahwa jika Anda ingin daftar baru Anda akan menggunakan sortedbukan list.sort.
miradulo

2
@SamuelNde Saya menggulir ke bawah di sini karena saya tidak yakin apakah ekspresi bekerja sama untuk diurutkan jadi itu membantu saya.
Red Riding Hood

Ya setuju, ini membantu saya juga
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))

keluaran -> Rogue One


Beberapa pemikiran: Ini sebenarnya tidak menjawab pertanyaan (bagaimana mendapatkan daftar yang diurutkan berdasarkan nilai di tupel); Anda dapat mengekstrak tupel langsung di loop Anda (untuk film, nilai dalam listoftuples :); Anda telah menimpa tipe 'tuple'; Dan sebenarnya dapat dilakukan adalah pemahaman daftar tunggal: (kembali diurutkan ((nilai, film) untuk film, nilai dalam listoftuples) [- 1] [1])
RFox

Saya menghargai apa yang Anda inginkan, tetapi saya berpendapat bahwa itu kurang elegan dan dapat ditingkatkan. Umumnya akan dianggap praktik yang buruk untuk mengubah urutan elemen menjadi tupple seperti ini. Saya pikir poin tentang pemahaman daftar dan pembongkaran tupples akan tetap berlaku. Dan saya akan melarang siapa pun yang menggunakan metodologi ini atas jawaban yang diterima.
RFox

Saya tidak mampu dan tidak bisa mendapatkan kode yang Anda posting untuk berfungsi, kemungkinan besar kesalahan pengguna
Darrell White

tetapi mengubahnya sedikit dan tidak diragukan lagi jawaban Anda 200x lebih baik.
Darrell White

def findMaxSales (listoftuples): newlist = sortir ((nilai, film) untuk film, nilai dalam listoftuples) return newlist [-1] [1] 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))
Darrell White
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.