2011-09-08 16 views
8

Sé que ya hay toneladas de preguntas sobre las listas/diccionarios de python, pero parece que no puedo encontrar una que ayude en mi caso, y estoy buscando la solución más eficiente como Voy a ordenar un conjunto de datos bastante grande.Ordenando un diccionario de tuplas en Python

Mis datos básicamente tiene este aspecto en la actualidad

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

básicamente estoy creando una lista de palabras en el que almaceno cada palabra junto con algunas estadísticas sobre ella (n, Sigma (x), Sigma (x^2))

Quiero ordenarlo en función de una estadística en particular. Hasta ahora he estado intentando algo en la línea de:

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

No estoy seguro de cómo controlar qué índice se ordenan en función de su eficacia, cuando una lista de tuplas de tuplas? Supongo que efectivamente necesito anidar dos operaciones de cambio de elemento pero no estoy seguro de cómo hacer esto.

Si hay una mejor estructura de datos que debería usar en su lugar, hágamelo saber. ¿Debo quizás crear una pequeña clase/estructura y luego usar una función lambda para acceder a un miembro de la clase?

Muchas gracias

Respuesta

4

¿Te gusta algo como esto?

>>> 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í, gracias perfectas! Sin embargo, leí en alguna parte que itemgetter es más rápido que usar una función lambda porque se compiló en C? Si no puedo usar itemgetter, esta solución está bien. –

+0

No se preocupe por el rendimiento hasta que tenga un programa en funcionamiento, completado con pruebas unitarias. Si el programa final * correcto * es demasiado lento, perfíllo y optimice los bits lentos. –

+0

buen punto :) Podría reescribirlo en C si es demasiado lento de todos modos, gracias por los indicadores :) –

1

Los nombres son más fáciles de trabajar y recordar que los índices, así que me gustaría ir con una clase:

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

eso es útil gracias! ¿No supone que define explícitamente el tipo de cada variable en la clase def? –

+0

@technosites Si por 'tipo de cada variable' quiere decir int vs str vs float, etc., puede usar propiedades para validación de datos y otras cosas. –

+0

Sí, eso es lo que quise decir, gracias :) –

Cuestiones relacionadas