2011-09-08 19 views
8

Python sıralama listeleri/sözlükleri hakkında zaten bir takım sorular olduğunu biliyorum, ancak durumumda yardımcı olan bir tane bulamıyorum ve en verimli çözümü buluyorum. Oldukça büyük bir veri kümesini sıralayacağım.Python'da tupleların bir sözlüğünü sıralama

a = {'a': (1, 2, 3), 'b': (3, 2, 1)} 

Temelde ben (n, Sigma (x), Sigma hakkında bazı istatistiklerle birlikte her kelimeyi saklamak hangi bir kelime listesi oluşturma ediyorum:

Benim veriler temelde şu anda bu gibi görünüyor (x^2))

Belirli bir statüye göre sıralamak istiyorum. Bunun dizilerini dizilerini zaman onun etkili bir şekilde listeye dayalı dizilmistir hangi indeks nasıl kontrol emin değilim

b = a.items() 
b.sort(key = itemgetter(1), reverse=True) 

: Şimdiye kadar çizgisinde bir şey çalışıyorum? Sanırım etkili bir şekilde iki itemgetter operasyonunu barındırmam gerekiyor ama bunu nasıl yapacağından emin değilim.

Bunun yerine kullanmam gereken daha iyi bir veri yapısı varsa lütfen bana bildirin. Belki de küçük bir sınıf/yapı oluşturmalı ve sonra sınıfın bir üyesine erişmek için bir lambda işlevi kullanmalı mıyım?

Teşekkürler

cevap

4

Böyle bir şey mi var?

>>> a = {'a': (1, 2, 3), 'b': (3, 2, 1)} 
>>> b = a.items() 
>>> b 
[('a', (1, 2, 3)), ('b', (3, 2, 1))] 
>>> b.sort(key=lambda x:x[1][2]) # sorting by the third item in the tuple 
>>> b 
[('b', (3, 2, 1)), ('a', (1, 2, 3))] 
+0

evet, mükemmel teşekkürler! Bununla birlikte, C 'nin derlendiği için itemgetter'in lambda işlevini kullanmaktan daha hızlı olduğunu bir yerde okudum? Ben itemgetter kullanamazsam o zaman bu çözüm iyidir. –

+0

Bir çalışma programına sahip oluncaya kadar, ünite testleri ile tamamlanana kadar performans konusunda endişelenmeyin. Final, * doğru *, program çok yavaşsa, o zaman profilleyin ve yavaş bitleri optimize edin. –

+0

iyi bir nokta :) Eğer zaten çok yavaş eğer C içinde yeniden yazabilir, işaretçiler için teşekkürler :) –

1

İsimler çalışmak ve bu indeksleri hatırlamak daha kolaydır, bu yüzden bir sınıf ile gider:

class Word(object):  # don't need `object` in Python 3 
    def __init__(self, word): 
     self.word = word 
     self.sigma = (some calculation) 
     self.sigma_sq = (some other calculation) 
    def __repr__(self): 
     return "Word(%r)" % self.word 
    def __str__(self): 
     return self.word 
    @property 
    def sigma(self): 
     return self._sigma 
    @sigma.setter    # requires python 2.6+ 
    def sigma(self, value): 
     if not value: 
      raise ValueError("sigma must be ...") 
     self._sigma = value 

word_list = [Word('python'), Word('totally'), Word('rocks')] 
word_list.sort(key=lambda w: w.sigma_sq) 
+0

thats yardımcı teşekkürler! Sınıf değişkenindeki her değişkenin türünü açıkça tanımladığınızı varsayalım mı? –

+0

@technosites Eğer 'her değişkenin türü' ile int vs vs vs vs vs vs demek iseniz, veri doğrulama ve niçin özelliklerini kullanabilirsiniz. –

+0

evet kastettiğim buydu, teşekkür ederim :) –