Saya memiliki beberapa data baik dalam daftar list atau daftar tupel, seperti ini:
data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]
Dan saya ingin mengurutkan oleh 2 elemen dalam subset. Artinya, menyortir oleh 2,5,8 mana 2
lebih dari (1,2,3)
, 5
lebih dari (4,5,6)
. Apa adalah cara yang umum untuk melakukan hal ini? Saya harus menyimpan tupel atau daftar dalam daftar saya?
Saya hanya ingin menambahkan untuk Stephen's jawaban jika anda ingin mengurutkan array dari tinggi ke rendah, cara lain selain di komentar di atas adalah hanya untuk menambahkan ini ke line:
reverse = True
dan hasilnya akan menjadi sebagai berikut:
data.sort(key=lambda tup: tup[1], reverse=True)
Untuk mengurutkan berdasarkan beberapa kriteria, yaitu misalnya dengan elemen kedua dan ketiga dalam sebuah tuple, biarkan
data = [(1,2,3),(1,2,1),(1,1,4)]
dan begitu menentukan lambda yang mengembalikan sebuah tuple yang menggambarkan prioritas, misalnya
sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]
Stephen's jawaban adalah salah satu yang saya'd gunakan. Untuk kelengkapan, di sini's the DSU (menghias-sort-undecorate) pola dengan daftar pemahaman:
decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]
Atau, lebih singkat:
[b for a,b in sorted((tup[1], tup) for tup in data)]
Seperti yang tercantum dalam Python Sorting HowTo, hal ini sudah tidak perlu karena Python 2.4, ketika fungsi tombol menjadi tersedia.
Dalam rangka untuk mengurutkan daftar tupel (<kata>, <hitung>)
, untuk menghitung
dalam urutan dan kata
dalam urutan abjad:
data = [
('betty', 1),
('bought', 1),
('a', 1),
('bit', 1),
('of', 1),
('butter', 2),
('but', 1),
('the', 1),
('was', 1),
('bitter', 1)]
Saya menggunakan metode ini:
sorted(data, key=lambda tup:(-tup[1], tup[0]))
dan itu memberi saya hasil:
[('butter', 2),
('a', 1),
('betty', 1),
('bit', 1),
('bitter', 1),
('bought', 1),
('but', 1),
('of', 1),
('the', 1),
('was', 1)]
itemgetter()
agak lebih cepat dari lambda tup: tup[1]
, tapi kenaikan ini relatif sederhana (sekitar 10 hingga 25 persen).
(IPython sesi)
>>> 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
@Stephen 's jawaban yang to the point! Berikut adalah contoh untuk visualisasi yang lebih baik,
Berteriak untuk Siap Pemain Satu fans! =)
>>> 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
adalah sebuah fungsi yang akan dipanggil untuk mengubah collection's item untuk dibandingkan.. seperti compareTo
metode di Jawa.
Parameter yang dilewatkan ke kunci harus menjadi sesuatu yang callable. Di sini, penggunaan lambda
menciptakan fungsi anonim (yang adalah callable).
Sintaks dari lambda adalah kata lambda diikuti oleh iterable nama kemudian satu blok kode.
Pada contoh berikut, kita menyortir daftar tupel yang memegang info abt saat acara tertentu dan nama aktor.
Kami adalah menyortir daftar ini dengan waktu kejadian peristiwa - yang merupakan elemen 0 sebuah tupel.
Catatan - s.mengurutkan([cmp[, kunci [reverse]]])
macam item s di tempat