Python memiliki jenis yang stabil, jadi asalkan kinerja bukan masalah, cara paling sederhana adalah mengurutkannya berdasarkan bidang 2 dan kemudian mengurutkannya lagi berdasarkan bidang 1.
Itu akan memberi Anda hasil yang Anda inginkan, satu-satunya hasil adalah bahwa jika itu adalah daftar besar (atau Anda ingin sering mengurutkannya) memanggil semacam dua kali mungkin overhead yang tidak dapat diterima.
list1 = sorted(csv1, key=operator.itemgetter(2))
list1 = sorted(list1, key=operator.itemgetter(1))
Melakukannya dengan cara ini juga memudahkan untuk menangani situasi di mana Anda ingin beberapa kolom diurutkan mundur, cukup sertakan parameter 'reverse = True' bila perlu.
Jika tidak, Anda dapat meneruskan beberapa parameter ke itemgetter atau membuat tuple secara manual. Itu mungkin akan lebih cepat, tetapi memiliki masalah bahwa itu tidak menggeneralisasi dengan baik jika beberapa kolom ingin diurutkan terbalik (kolom numerik masih dapat dibalik dengan meniadakannya tetapi itu menghentikan pengurutan menjadi stabil).
Jadi jika Anda tidak memerlukan kolom yang disortir terbalik, pilih beberapa argumen untuk itemgetter, jika Anda mau, dan kolom tidak numerik atau Anda ingin menjaga penyortiran stabil untuk beberapa jenis berturut-turut.
Sunting: Untuk komentator yang memiliki masalah dalam memahami bagaimana ini menjawab pertanyaan asli, berikut adalah contoh yang menunjukkan dengan tepat bagaimana sifat stabil penyortiran memastikan kami dapat melakukan pengurutan terpisah pada setiap kunci dan berakhir dengan data yang diurutkan pada beberapa kriteria:
DATA = [
('Jones', 'Jane', 58),
('Smith', 'Anne', 30),
('Jones', 'Fred', 30),
('Smith', 'John', 60),
('Smith', 'Fred', 30),
('Jones', 'Anne', 30),
('Smith', 'Jane', 58),
('Smith', 'Twin2', 3),
('Jones', 'John', 60),
('Smith', 'Twin1', 3),
('Jones', 'Twin1', 3),
('Jones', 'Twin2', 3)
]
# Sort by Surname, Age DESCENDING, Firstname
print("Initial data in random order")
for d in DATA:
print("{:10s} {:10s} {}".format(*d))
print('''
First we sort by first name, after this pass all
Twin1 come before Twin2 and Anne comes before Fred''')
DATA.sort(key=lambda row: row[1])
for d in DATA:
print("{:10s} {:10s} {}".format(*d))
print('''
Second pass: sort by age in descending order.
Note that after this pass rows are sorted by age but
Twin1/Twin2 and Anne/Fred pairs are still in correct
firstname order.''')
DATA.sort(key=lambda row: row[2], reverse=True)
for d in DATA:
print("{:10s} {:10s} {}".format(*d))
print('''
Final pass sorts the Jones from the Smiths.
Within each family members are sorted by age but equal
age members are sorted by first name.
''')
DATA.sort(key=lambda row: row[0])
for d in DATA:
print("{:10s} {:10s} {}".format(*d))
Ini adalah contoh runnable, tetapi untuk menyelamatkan orang yang menjalankannya, hasilnya adalah:
Initial data in random order
Jones Jane 58
Smith Anne 30
Jones Fred 30
Smith John 60
Smith Fred 30
Jones Anne 30
Smith Jane 58
Smith Twin2 3
Jones John 60
Smith Twin1 3
Jones Twin1 3
Jones Twin2 3
First we sort by first name, after this pass all
Twin1 come before Twin2 and Anne comes before Fred
Smith Anne 30
Jones Anne 30
Jones Fred 30
Smith Fred 30
Jones Jane 58
Smith Jane 58
Smith John 60
Jones John 60
Smith Twin1 3
Jones Twin1 3
Smith Twin2 3
Jones Twin2 3
Second pass: sort by age in descending order.
Note that after this pass rows are sorted by age but
Twin1/Twin2 and Anne/Fred pairs are still in correct
firstname order.
Smith John 60
Jones John 60
Jones Jane 58
Smith Jane 58
Smith Anne 30
Jones Anne 30
Jones Fred 30
Smith Fred 30
Smith Twin1 3
Jones Twin1 3
Smith Twin2 3
Jones Twin2 3
Final pass sorts the Jones from the Smiths.
Within each family members are sorted by age but equal
age members are sorted by first name.
Jones John 60
Jones Jane 58
Jones Anne 30
Jones Fred 30
Jones Twin1 3
Jones Twin2 3
Smith John 60
Smith Jane 58
Smith Anne 30
Smith Fred 30
Smith Twin1 3
Smith Twin2 3
Perhatikan secara khusus bagaimana pada langkah kedua reverse=True
parameter menjaga nama depan tetap berurutan sedangkan hanya mengurutkan lalu membalikkan daftar akan kehilangan urutan yang diinginkan untuk kunci pengurutan ketiga.