2011-07-12 15 views
25

göre Azalan ... bu eleman 0 inen ve eleman sıralanır yüzden onları sıralamak nasılPython sıralama listeleri/yükselen listesi ve ben şöyle bir listesini içeren bir liste varsa o zaman

['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3] 

1 Ben elemanı 0. tersten geçebilir itemgetter kullanma

['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3] 

... yani sonuç gibi görünecektir artan sıralanmış ama ben o zaman önceki tür kalıntıları ders için elemana karşı çare. Birleştirilmiş anahtarı yapamıyorum çünkü ilk önce azalan ve sonra artan şekilde sıralamak gerekiyor.

TIA,

cevap

32
L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]] 
L.sort(key=lambda k: (k[0], -k[1]), reverse=True) 

L şimdi içeriyor PK:

[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]] 
+0

İzin verdiği anda kabul eder. Bu tam olarak ihtiyacım olan şey. Depomuzdaki picklists için bir bin/depo yönlendirme sorunu üzerinde çalışıyorum ve bu hile yaptı. Eğer zamanınız varsa, “lambda k: (k [0], - k [1])” nin ne yaptığını açıklayabilir misiniz? Negatif işaret, ters anlam ifade ediyor mu? Aynı sonucu lambda k: (-k [0], k [1]) ters argüman olmadan alabilir miyim? – Ominus

+0

@Ominus: '-k [1]', kendi doğal sıralama sırasını tersine çeviren tam sayıdaki işareti döndürür. Bu değer bir dize olduğu için '-k [0]' yapamazsınız. Yani, 'reverse = True', sıralama düzenini tersine çevirir ve' -k [1] ', ikinci elemandaki geri dönüşü iptal eder. –

2

şey

def mycmp(a, b): 

    res = cmp(a[0], b[0]) 
    if res == 0: 
    return cmp(a[1], b[1]) 
    return res 

newlist = sorted(input_list, cmp=mycmp) 

karşılaştırma yöntemi

gibi önce her elemanın ilk öğeyi denetler. Eşittirlerse, her bir öğenin ikinci öğelerini kontrol eder. Mycmp() uygulamasındaki dönüş değeri, farklı bir sıralama davranışı uygulamak için reddedilebilir.

25

Sen piton en sortstable olduğu gibi sıralama ardışık mermi yapabilirsiniz. Yine de ikincil anahtarını'a göre sıralamanız gerekir. Ayrıca official HOW TO'a da bakın.

from operator import itemgetter 
l = [['a',2], ['a',1], ['b', 2], ['a',3], ['b',1], ['b',3]] 
l.sort(key=itemgetter(1)) 
l.sort(key=itemgetter(0), reverse=True) 
# [['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]] 
İlgili konular