2009-03-13 27 views
53

Python'un varsayılan liste sıralayıcısı, bir tuple listesi geçtiğinde, her bir tuple'daki ilk öğeye göre sıralama yapar gibi görünüyor. Bu doğru mu? Değilse, ilk elemanlarına göre bir tupl listesini sıralamanın doğru yolu nedir?Python bir tupl listesini nasıl sıralıyor?

+5

göre sıralamak için? Eğer öyleyse, ne gördün? Lütfen örnek kodunuzu gönderin. –

cevap

67

Bu, tupllerdeki ilk elemanlar tarafından otomatik olarak bir tupl listesini sıralar, daha sonra ikinci elemanlar ve böylece tuple ([1,2,3]) tuple ([1,2,4]) önce gider . Bu davranışı geçersiz kılmak istiyorsanız sıralama yöntemine ikinci argüman olarak bir satır geçirebilirsiniz. Bu callable 1, -1, 0 döndürmelidir.

+15

Sıralamak için anahtar argüman olsa bile cmp argüman kullanmayın! Bu foo.sort'u (anahtar = lambda x: x [1]) foo.sort'a (lambda x, y: cmp (x [1], y [1])) tercih eder. Anlamak hem daha kolay hem de daha verimli. – cthulahoops

+9

@cthulahoops Ben “operator.itemgetter” kullanarak lambda fonksiyonundan daha iyi olduğunu düşünüyorum: foo.sort (key = operator.itemgetter (1)) 'foo.sort'dan daha güzel (anahtar = lambda x: x [1]) '. Bu sadece benim düşüncem. –

+0

Ancak belgelere alakalı bir bağlantı olması güzel olurdu. – gaazkam

5

Hayır, tupllar dizeler gibi sequence types'dır. Bunlar sırayla her eleman kıyaslayarak, aynı sıralanır:

>>> import random 
>>> sorted([(0,0,0,int(random.getrandbits(4))) for x in xrange(10)]) 
[(0, 0, 0, 0), (0, 0, 0, 4), (0, 0, 0, 5), (0, 0, 0, 7), (0, 0, 0, 8), 
(0, 0, 0, 9), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 14)] 

üç sıfır ilk elemanın dışında bir şeylerin kontrol elde edilmelidir göstermek için sadece vardır.

+0

Hm. Azınlıktayım gibi görünüyorum ... Python her tupleda sadece ilk öğeye bakarak sıralarsa, test sonuçlarımı anlamıyorum. – unwind

+0

İlk öğe ile başlar, ancak sonra devam eder. Vasil'in cevabına bakın. –

0

Dahili liste sıralama yöntemini kullanmayı deneyin ve bir lambda geçirin. Eğer ilk elemanınız bir tamsayı ise, bu işe yarayacaktır.

# l is the list of tuples 
l.sort(lambda x,y: x-y) 

Karşılaştırma işlevi için herhangi bir harca kullanabilirsiniz, mutlaka bir lambda değil. Bununla birlikte, -1 (az), 0 (eşit) veya 1 (büyüktür) döndürmesi gerekir.

+0

-1: Bu bir tupl listesiyle nasıl çalışır? TypeError alırsınız: -: 'tuple' ve 'tuple' için desteklenmeyen işlenen tür (ler) i –

+0

Sıralamada çalıştırılacak olan lambda işlevi, bir tupla serie'nin yinelenen öğesi olan bir argümana sahip olmalıdır: pairs.sort (anahtar = lambda çifti: çifti [1]). ilk elemanın siparişi verildikten sonra ikinci bir sipariş katmanına sahip olmak istiyorsanız çiftler.sort (anahtar = lambda çifti: çift [1]) veya pairs.sort (anahtar = lambda çifti: çift [1], çift [0]) . – Alex

0

Kontrol dışarı "Devin jeanpierre" diye bir tuple kullanmaktır diyor ve gösteren bu soruya sort-a-dictionary-in-python-by-the-value cevabı nasıl gerçekte örnek kod çalıştırmasına mı ikinci değere

İlgili konular