Python a un tri stable, donc à condition que la performance n'est pas un problème, le plus simple est de faire le tri par le champ 2 et ensuite de les trier à nouveau par le champ 1.
Cela vous donnera le résultat que vous voulez, le seul hic, c'est que si c'est une grande liste (ou que vous voulez trier souvent) l'appel de trier par deux fois peut-être inacceptable pour les frais généraux.
list1 = sorted(csv1, key=operator.itemgetter(2))
list1 = sorted(list1, key=operator.itemgetter(1))
Cette façon de faire permet également de gérer la situation où vous souhaitez que certaines colonnes inverse triés, il suffit d'inclure le "reverse=True' paramètre si nécessaire.
Sinon, vous pouvez passer plusieurs paramètres à itemgetter ou créer manuellement un n-uplet. Qui va probablement être plus rapide, mais le problème est qu'il n'a pas généraliser bien si certaines colonnes voulez être inversée triés (colonnes numériques peuvent encore être inversée, en niant, mais qui s'arrête le tri étant stable).
Donc, si vous n'avez pas besoin de toutes les colonnes inverse triés, partir pour de multiples arguments pour itemgetter, si vous pouvez, et les colonnes ne sont pas numériques ou vous veulent garder le tri stable de partir pour de multiples consécutifs sortes.