Python มีการเรียงลำดับที่เสถียรดังนั้นหากประสิทธิภาพไม่เป็นปัญหาวิธีที่ง่ายที่สุดคือจัดเรียงตามฟิลด์ 2 จากนั้นเรียงลำดับอีกครั้งตามฟิลด์ 1
ที่จะให้ผลลัพธ์ที่คุณต้องการสิ่งเดียวที่จับได้คือถ้ามันเป็นรายการใหญ่ (หรือคุณต้องการเรียงลำดับบ่อย ๆ ) การเรียกเรียงสองครั้งอาจเป็นค่าใช้จ่ายที่ไม่สามารถยอมรับได้
list1 = sorted(csv1, key=operator.itemgetter(2))
list1 = sorted(list1, key=operator.itemgetter(1))
การทำเช่นนี้ช่วยให้คุณจัดการกับสถานการณ์ที่คุณต้องการเรียงลำดับของคอลัมน์ย้อนกลับได้ง่ายเพียงแค่รวมพารามิเตอร์ 'reverse = True' เมื่อจำเป็น
มิฉะนั้นคุณสามารถส่งพารามิเตอร์หลายรายการไปยัง itemgetter หรือสร้าง tuple ด้วยตนเอง ที่อาจจะเร็วขึ้น แต่มีปัญหาที่มันไม่ได้พูดคุยกันได้ดีถ้าบางคอลัมน์ต้องการที่จะเรียงกลับกัน (คอลัมน์ตัวเลขยังคงสามารถย้อนกลับได้โดยการคัดค้านพวกเขา
ดังนั้นหากคุณไม่ต้องการเรียงคอลัมน์กลับกันให้ไปหาอาร์กิวเมนต์หลายตัวเพื่อ itemgetter ถ้าคุณทำได้และคอลัมน์นั้นไม่ได้เป็นตัวเลขหรือคุณต้องการให้การเรียงแบบคงที่นั้นมีความต่อเนื่องหลายประเภท
แก้ไข:สำหรับผู้แสดงความคิดเห็นที่มีปัญหาในการทำความเข้าใจว่าคำถามนี้ตอบคำถามเดิมได้อย่างไรนี่เป็นตัวอย่างที่แสดงให้เห็นว่าลักษณะการเรียงลำดับที่แน่นอนทำให้เราสามารถแยกประเภทของแต่ละคีย์และจบลงด้วยข้อมูลที่เรียงตามเกณฑ์หลายประการ:
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))
นี่เป็นตัวอย่างที่ทำงานได้ แต่เพื่อช่วยให้ผู้ใช้ทำงานได้ผลลัพธ์คือ:
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
โดยเฉพาะอย่างยิ่งโปรดทราบว่าในขั้นตอนที่สองreverse=True
พารามิเตอร์เก็บชื่อไว้ในลำดับอย่างไรในขณะที่การเรียงลำดับจากนั้นการย้อนกลับรายการจะสูญเสียลำดับที่ต้องการสำหรับคีย์การเรียงลำดับที่สาม