2011-08-20 8 views
5

Estoy buscando reemplazar las claves de un dict por variantes más cortas para que pueda enviarse a través del cable en una forma compacta. ¿Hay alguna manera de actualizar una clave, en lugar de crear un nuevo elemento en el dict y eliminar el antiguo?Cambie eficientemente la clave de un dict de Python

Lo que estoy haciendo ahora:

>>> a = dict(long_key=None) 
>>> a['l'] = a['long_key'] 
>>> del a['long_key'] 

Lo que me gustaría hacer es algo como esto:

>>> a = dict(long_key=None) 
>>> a.update_key('long_key', 'l') 

Estoy seguro de partes internas dict 's. Sin embargo, parece que algo como update_key podría evitar la necesidad de eliminar la clave anterior.

+0

¿Está buscando eficiencia de espacio, eficiencia de tiempo o elegancia de código? – Claudiu

+7

Comprimir su transporte es probablemente una solución más segura que ofuscar sus datos. –

+2

Solo para responder a las críticas sobre el enfoque, hice la pregunta porque estoy interesado en aprender cómo funciona el 'dict' de Python. Estos pequeños fragmentos no representan todo lo que estoy haciendo, solo sirven para demostrar mis intenciones de aclarar la pregunta. Bajar una Q sobre la base de que no te gusta su tema es un poco mezquino. Las preguntas deben ser downvoted porque no son claras o vagas. –

Respuesta

3

Una solución más elegante podría ser la creación de un nuevo diccionario ... esencialmente hacer una copia superficial ligeramente diferente:

a_send = dict((k[0], v) for k,v in a.items()) 

que sin duda será menos eficiente con el espacio, aunque - está buscando la eficiencia del espacio , la eficiencia del tiempo o la elegancia del código?

+0

Marcado como aceptado como algunos la forma de expresión del generador es probablemente el mejor camino a seguir. –

1

¿Cuántas veces lo necesita para enviarlo? ¿Tal vez en lugar de cambiar algo, simplemente puede procesar las claves sobre la marcha?

En vez de hacer algo así (adivinando pseudo-código):

short_dict = shorten_keys(long_dict) 
for k,v in short_dict: 
    send_over(k,v) 

hacer algo como:

for k,v in long_dict: 
    send_over(shorten(k),v) 

Si usted tiene que enviar muchas veces, también puede crear un mapa de long -> short keys y úselo mientras envía. Perder espacio/tiempo para crear copias podría no ser la mejor solución.

0
longer = dict(long_key=None) 
mapping = dict(long_key='l') 
shorter = dict((mapping[k], v) for k,v in longer.iteritems()) 
3

Eso es una optimización prematura. Si realmente desea ahorrar ancho de banda, hágalo comprimiendo los datos normally o use estructuras de datos más simples.

Cuestiones relacionadas