Python'un kararlı bir türü vardır, bu nedenle performansın bir sorun olmaması şartıyla, en basit yol onu alan 2'ye göre sıralamak ve daha sonra tekrar alan 1'e göre sıralamaktır.
Bu size istediğiniz sonucu verecektir, tek yakalama büyük bir liste (veya sık sık sıralamak istiyorsanız) iki kez sıralama çağırmak kabul edilemez bir yük olabilir olmasıdır.
list1 = sorted(csv1, key=operator.itemgetter(2))
list1 = sorted(list1, key=operator.itemgetter(1))
Bu şekilde yapmak, bazı sütunların tersine sıralanmasını istediğiniz durumun işlenmesini de kolaylaştırır, sadece gerektiğinde 'reverse = True' parametresini ekleyin.
Aksi takdirde, itemgetter'a birden fazla parametre iletebilir veya manuel olarak bir demet oluşturabilirsiniz. Bu muhtemelen daha hızlı olacak, ancak bazı sütunların tersine sıralanması isteniyorsa iyi bir şekilde genelleştirilmemesi sorunu var (sayısal sütunlar yine de reddedilerek tersine çevrilebilir, ancak sıralama sabit kalır).
Dolayısıyla, ters sıralanmış sütunlara ihtiyacınız yoksa, itemgetter için birden fazla bağımsız değişkene gidin, eğer mümkünse ve sütunlar sayısal değilse veya sıralamayı birden çok ardışık sıralama için sabit tutmak istiyorsanız.
Düzenleme: Bu orijinal soruya nasıl cevap anlamakta sorun yaşayan yorumcular için, burada tam olarak sıralama istikrarlı doğası nasıl her anahtar ayrı sıralar yapmak ve birden çok kritere göre sıralanmış verilerle sonuçlanmasını sağlar bir örnek:
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))
Bu çalıştırılabilir bir örnektir, ancak çalıştıran kişileri kaydetmek için çıktı:
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
Özellikle ikinci adımda reverse=True
parametrenin adların sırasını nasıl koruduğuna dikkat edin, listeyi sıralamak ve tersine çevirmek üçüncü sıralama anahtarı için istenen sırayı kaybedecektir.