2011-09-08 31 views
8

So che ci sono tonnellate di domande sugli elenchi/dizionari di Python già, ma non riesco a trovarne uno che aiuti nel mio caso, e sto cercando la soluzione più efficiente come Sto per ordinare un set di dati piuttosto grande.Ordinamento di un dizionario di tuple in Python

I miei dati appare fondamentalmente come questo al momento:

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

sto fondamentalmente la creazione di un elenco di parole in cui memorizzare ogni parola insieme ad alcune statistiche su di esso (n, Sigma (x), Sigma (x^2))

Voglio ordinarlo in base a una particolare statistica. Finora ho cercato qualcosa sulla falsariga di:

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

io non sono sicuro di come controllare quale indice è ordinato basa su quando il suo modo efficace una lista di tuple di tuple? Immagino di dover effettivamente nidificare due operazioni itemgetter ma non sono sicuro di come farlo.

Se c'è una struttura dati migliore che dovrei usare, per favore fatemelo sapere. Dovrei forse creare una piccola classe/struct e quindi usare una funzione lambda per accedere a un membro della classe?

Molte grazie

risposta

4

Qualcosa di simile?

>>> 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

sì, perfetto, grazie! Tuttavia ho letto da qualche parte che itemgetter è più veloce di usare una funzione lambda perché è compilata la sua C? Se non riesco a usare itemgetter, questa soluzione va bene comunque. –

+0

Non preoccuparti delle prestazioni finché non hai un programma funzionante, completo di test delle unità. Se il finale, * correct *, il programma è troppo lento, quindi profilalo e ottimizza i bit lenti. –

+0

buon punto :) Potrei riscriverlo in C se è troppo lento comunque, grazie per i puntatori :) –

1

I nomi sono più facili da lavorare e ricordare che gli indici, quindi vorrei andare con una classe:

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

questo è utile grazie! Non supponiamo di definire esplicitamente il tipo di ciascuna variabile nella classe def? –

+0

@technosites Se per "tipo di ciascuna variabile" si intende int vs str vs float ecc, è possibile utilizzare le proprietà per la convalida dei dati e quant'altro. –

+0

sì, questo è quello che intendevo, grazie :) –

Problemi correlati