2010-08-04 45 views
5

Genellikle lambda ifadeleri kullanarak Python'da çeşitlerim ve her ne kadar iyi çalışıyor olsa da, bunun çok okunabilir olmadığını ve daha iyi bir yol olabileceğini umuyorum. İşte benim için tipik bir kullanım vakası.Lambda ifadesi olmayan python sıralaması

Ben mesela numaralarının listesini,

x = [12, 101, 4, 56, ...] Ben endeksleri ayrı liste var var: Ben x değerlere dayalı y sıralamak istiyorum y = range(len(x))

ve bunu:

y.sort(key=lambda a: x[a]) 

Lambda kullanmadan bunu yapmanın iyi bir yolu var mı?

+0

Herhangi özel bir nedeni? 'x_sorted = sıralanmış (x)' – MattH

+1

OP, elemanların indekslerini, öğelerin kendilerine değil, sıralanmış sıraya göre ister. – PaulMcG

+1

Bu "lambda" uzun ve çirkin bir anahtar kelime olduğu için utanç verici. Bu, bunu yapmanın çok yolu. – PaulMcG

cevap

11

x listesinin __getitem__ yöntemini kullanabilirsiniz. Bu lambda aynı şekilde davranır ve bunun yerine bir piton fonksiyonunun bir C fonksiyonu olarak uygulanır çünkü çok daha hızlı olacaktır: Orijinal değerlerin bir sıralanmış liste yetmeyeceği neden

>>> x = [12, 101, 4, 56] 
>>> y = range(len(x)) 
>>> sorted(y, key=x.__getitem__) 
[2, 0, 3, 1] 
+0

Teşekkürler, bunun en okunaklı çözüm olduğunu düşünüyorum. –

5
zarif

değil, ama: BTW

[a for (v, a) in sorted((x[a], a) for a in y)] 

, sen endeksleri ayrı bir liste yaratmadan yapabilirsiniz: Bu alternatifin tür ise

2

emin değilim sen demek, ancak bir def ile anahtar işlevi tanımlayabilirsiniz: Şahsen

def sort_key(value): 
    return x[value] 

y.sort(key = sort_key) 

, ben t düşünüyorum sıralama ölçütünü sıralama sırasındaki kod satırından uzaklaştırdığı ve sort_key işlevini ad alanınıza gereksiz yere eklediği için lambda'dan daha beterdir.

0

ben başka bir fonksiyon yaratmak isteseydim, herhalde ben o böyle bir şey (test) yapabilirdi:

def sortUsingList(indices, values): 
    return indices[:].sort(key=lambda a: values[a]) 

ben ekstra bir işlev oluşturmak zorunda kalmamak için yerine lambda kullanmayı tercih düşünüyorum rağmen .

+0

Lambda'yı isteğinize karşı kullanıyorsunuz (buna rağmen kullanıyorum). –