Python имеет стабильную сортировку, поэтому при условии, что производительность не является проблемой, самый простой способ - отсортировать ее по полю 2, а затем снова отсортировать по полю 1.
Это даст вам желаемый результат, единственная выгода в том, что, если это большой список (или вы хотите его часто сортировать), дважды вызвать сортировку может быть недопустимо.
list1 = sorted(csv1, key=operator.itemgetter(2))
list1 = sorted(list1, key=operator.itemgetter(1))
Это также облегчает обработку ситуации, когда вы хотите, чтобы некоторые столбцы сортировались в обратном порядке, просто при необходимости включите параметр «reverse = True».
В противном случае вы можете передать несколько параметров в itemgetter или вручную создать кортеж. Вероятно, это будет быстрее, но есть проблема в том, что он плохо обобщается, если некоторые столбцы хотят быть отсортированы в обратном порядке (числовые столбцы все еще можно перевернуть путем их отрицания, но это мешает стабильности сортировки).
Поэтому, если вам не нужны никакие столбцы с обратной сортировкой, перейдите, если хотите, к нескольким аргументам 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
параметр сохраняет имена первым по порядку, тогда как простая сортировка, а затем обращение к списку приведет к потере желаемого порядка для третьего ключа сортировки.