MS-Excelライクな拡張ソート

Excelはあまり使わないけど、最もシンプルにデータを見るときには使うことがある。プログラムからCSVで保存して、Excelで見るといった感じ。一応、こんなのも作ってます。Pythonで、リストをCSV形式に変換 - シコウサクゴ()
で、Excelでデータを見るときにソートをしたりするんですが、その際に「選択範囲を拡張する」ということをやると、同じ行にあるデータもすべて入れ替わるということができます。Pythonで同じようなことは出来ないはずです。でも、僕はやりたいので、作りました。

def excelSort(mat, r):
	def _qsort(seq, nums):
		if len(seq) < 1: return seq, nums;
		pivot = seq[0]; pivot_n = nums[0];
		left = []; right = []; left_n = []; right_n = [];
		for i in xrange(1 ,len(seq)):
			if seq[i] <= pivot: # 不等号を逆にすると、順番が逆になる
				left.append(seq[i]);
				left_n.append(nums[i]);
			else:
				right.append(seq[i]);
				right_n.append(nums[i]);
		left,left_n = _qsort(left, left_n);
		right,right_n = _qsort(right, right_n);
		return left+[pivot]+right, left_n+[pivot_n]+right_n;
	nums = [i for i in xrange(len(mat))];
	seq,nums2 = _qsort(zip(*mat)[r-1], nums);
	return [mat[i] for i in nums2];

簡単な例で、この関数を説明しますと

ばなな 4
りんご 1
みかん だいだい 2

こんなようなデータがあったとします。このデータを上のexcelSort()で、3列目の数値をソートにかけると

りんご 1
みかん だいだい 2
ばなな 4

こんな感じになります。3列目の数値で昇順ソートをかけて、行ごと順番を入れ替えるようなことをします。具体的に、例えばmatという2次元配列の2列目をソートすると、

>>> mat = [[1,2,"あ"],[5,2,"い"],[1,1,"う"],[1,8,"え"]];
>>> print excelSort(mat, 2);
[[1, 1, '\xe3\x81\x86'], [5, 2, '\xe3\x81\x84'], [1, 2, '\xe3\x81\x82'], [1, 8, '\xe3\x81\x88']]

日本語がちゃんと表示されていませんが、ちゃんと答えは求められます。