Sıralama

Temel Python nesne listelerini sıralamak genelde oldukça verimlidir. Listeki sıralama yöntemleri, sıralama davranışını değiştiren isteğe bağlı kullanılan bir kıyaslama fonksiyonunu bağımsız değişken olarak alırlar. Oldukça kullanışlı olmalarına rağmen karşılaştırma fonksiyonu defalarca çağrılacağından sıramalarınızı ciddi ölçüde yavaşlatabilir. Python sürüm 2.4'te yerleşik (built-in) sıralama metodu yerine sıralama için en hızlı yöntem olması gereken anahtar bağımsız değişkenleri kullanmalısınız.

Eğer bundan daha eski Python sürümü kullanıyorsanız Guido van Rossum'un şu tavsiyesine kulak verin:

Sıralamaları hızlandırmanın diğer bir yolu ilk elemanı varsayılan karşılaştırmaya bakılarak sıralanacak sıralama anahtarları olan tüpler oluşturmaktır. Bu tüplerin ikinci elemanı da asıl liste elemanlarıdır. Bu yöntem DecorateSortUndecorate olarak da bilinen Schwartzian Dönüşümü'dür.

Diyelim ki her birinin n. alanına göre sıralamak istediğiniz tüp listeleriniz var. Aşağıdaki fonksiyon bu işi yapacaktır:

		def sortby(somelist, n):
			nlist = [(x[n], x) for x in somelist]
			nlist.sort()
    			return [val for (key, val) in nlist]
	

Kullandığımız listenin sıralama yöntemi davranışını (yerinde, in place, sıralama) karşılaştırmak da basitçe gerçeklenmiş olur:

		def sortby_inplace(somelist, n):
			somelist[:] = [(x[n], x) for x in somelist]
			somelist.sort()
			somelist[:] = [val for (key, val) in somelist]
    			return
	

Denemek için aşağıdaki örneğe bakalım:

		>>> somelist = [(1, 2, 'def'), (2, -4, 'ghi'), (3, 6, 'abc')]
		>>> somelist.sort()
		>>> somelist
		[(1, 2, 'def'), (2, -4, 'ghi'), (3, 6, 'abc')]
		>>> nlist = sortby(somelist, 2)
		>>> sortby_inplace(somelist, 2)
		>>> nlist == somelist
		True
		>>> nlist = sortby(somelist, 1)
		>>> sortby_inplace(somelist, 1)
		>>> nlist == somelist
		True		
	

Tim Delaney'den

Python 2.3 sürümünden itibaren sıralama işleminin kararlı olduğu garanti edilmiştir.

(net olmak gerekirse CPython 2.3 sürümünde kararlı idi ve Python 2.4 sürümünde kararlı olacağı garanti edildi)

Python 2.4 sürümü dönüşümü oldukça kolay hale getiren isteğe bağlı bir parametre ekler:

		import operator
		sort(nlist, key=operator.itemgetter(n))
	

Asıl elemanın sıralama için kullanılmadığına dikkat edin. Bu şunu yapmakla aynıdır:

		nlist = [(x[i], i, x) for (i, x) in enumerate(nlist)]
		nlist.sort()
		nlist = [val for (key, index, val) in nlist]