2011-05-10 20 views
7

es posible diseñar un diccionario en python de forma tal que esté obligado a tener claves únicas y si por error se agrega una clave que ya está en el diccionario se rechaza. gracias¿Cómo puedo forzar a un diccionario en python a que solo tenga claves únicas?

+1

Me gustaría señalar que las "claves únicas" son propiedad inherente de un diccionario. Cuando inserta un par de clave/valor, actualiza las entradas anteriores que darían lugar a claves duplicadas. Tu pregunta, por lo tanto, arrojó mi racha. Ahora, mientras leo esto más de cerca, entiendo que lo que está pidiendo es evitar tales actualizaciones, que es una extensión válida y comprensible. Solo quería aclarar esto para otros lectores, para que no se confundan al pensar que deben evitar duplicar claves en un sentido más general. – BuvinJ

+0

^Sí y como vemos en la respuesta del usuario2197172 a continuación, el uso de 'setdefault' es el complemento: se traga en voz baja los intentos de agregar claves duplicadas. –

Respuesta

18

Siempre se puede crear su propio diccionario

class UniqueDict(dict): 
    def __setitem__(self, key, value): 
     if key not in self: 
      dict.__setitem__(self, key, value) 
     else: 
      raise KeyError("Key already exists") 
+10

Tenga en cuenta que el método '__init__' no es realmente necesario cuando no hace más que llamar al padre' __init__' con los mismos argumentos. –

+0

Wow, no lo sabía gracias ^^ –

+0

Creo que esta es la respuesta correcta, pero no estoy enamorado del nombre de esta clase. Ver mi comentario sobre la pregunta inicial. Tal vez algo como "InsertOnlyDict" o "NoUpdateDict", etc. sería más claro? – BuvinJ

0

Puede crear un diccionario personalizado derivando de dict y anulando __setitem__ para rechazar elementos que ya están en el diccionario.

+0

¿me puede dar un ejemplo? No soy tan profesional en python.thx – Hossein

+1

@Hossein: la respuesta de @Jakobs proporciona un ejemplo. –

4

Sólo echa su dict antes de agregar el elemento

if 'k' not in mydict: 
    mydict.update(myitem) 
+0

puede hacer: 'si 'k' no en mydict' sin' .keys() ':) – mouad

+1

@singularity: DEBERÍA (no puede) evitar el' .keys() '... es una gran pérdida de recursos. –

+0

Lo siento, eso fue un descuido. Se corrigió en la respuesta. – Gevious

1

Este es el propósito de setdefault:

>>> x = {} 
>>> print x.setdefault.__doc__ 
D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D 
>>> x.setdefault('a', 5) 
5 
>>> x 
{'a': 5} 
>>> x.setdefault('a', 10) 
5 
>>> x 
{'a': 5} 

Esto también significa que puede omitir "if" clave "en dict: ... else: ..."

>>> for val in range(10): 
...  x.setdefault('total', 0) 
...  x['total']+=val 
... 
0 
0 
1 
3 
6 
10 
15 
21 
28 
36 
>>> x 
{'a': 5, 'total': 45} 
+0

Esta es una linda respuesta, y de hecho, las claves duplicadas se tragan silenciosamente, ¿es lo mismo que "rechazado"? Ninguna excepción se plantea. –

Cuestiones relacionadas