2012-02-09 95 views
6

Quiero implementar una tabla hash en python. En la mesa, un objeto de clase se asociará con el valor de la clave. El problema es que quiero usar el valor clave para encontrar el índice de la clase y actualizarla (lo cual, por supuesto, no es un problema). Pero, ¿qué puedo hacer si quiero ordenar la tabla usando un valor particular de la clase?Diseño de tabla hash Python

Por ejemplo, consideremos, tenemos tres valores: documento_id, puntaje y rango. Hay un "documento" de clase que consiste en "puntaje" y "rango". "document_id" será la clave de la tabla.

Quiero actualizar el "puntaje" de varias entradas de la tabla, usando la clave: "document_id". Pero cuando se realiza la actualización de los puntajes, quiero ordenar la lista/tabla usando el puntaje y asignar el valor del rango a la variable "rango" en base al puntaje actualizado.

¿Alguien puede darme amablemente alguna guía sobre cómo puedo proceder? O tal vez debería simplemente hacer una lista?

El número máximo de elementos de la tabla puede ser de hasta 25000-30000.

Gracias.

Respuesta

21

El dict de Python ya es una tabla hash.

doc_hash = {} 
doc_hash[doc.id] = doc 

Para asignar rango:

docs = sorted(doc_hash.itervalues(), key=operator.attrgetter('score'), reverse=True) 
for i, doc in enumerate(docs): 
    doc.rank = i 
+0

Gracias por la respuesta. Pero si trato de actualizar el rango cada vez que actualizo/inserto un documento, ¿no aumentará rápidamente el orden del ciclo, en lugar de una clasificación al final de toda inserción/actualización? No haré nada más con los rangos. Después de clasificarlos, los pondré en un archivo. –

+0

No sé a qué te refieres con "aumenta rápidamente"? Puede agregar un montón de documentos y luego reasignar los rangos de una vez al final. Me equivoqué al hablar de "cada vez que insertas uno". –

+0

Lo siento, si está al final de agregar documentos, entonces está bien. Estaba hablando del tamaño de la mesa. Pensé que si trataba de ejecutar una clasificación cada vez que ingresaba/actualizaba una entrada en una mesa enorme, podría convertirse en un proceso largo. –

0

Algo como esto?

sorted_keys = sorted(d.keys(), key=lambda element: element['score']) 
for i in range(len(sorted_keys)): 
    d[sorted_keys[i]]['rank'] = i 

asigna a cada elemento en d (elementos se implica para ser diccionarios también) un rango en función de su puntuación.

+9

Más información sobre 'enumerar'. Te hará feliz :) –

4

¿Por qué no utilizar un OrderedDict?

>>> from collections import OrderedDict 

>>> # regular unsorted dictionary 
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 

>>> # dictionary sorted by key 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) 
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

>>> # dictionary sorted by value 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) 
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) 

>>> # dictionary sorted by length of the key string 
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) 
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])