2010-06-04 18 views
26

En Python, necesito un objeto de diccionario que se parece a:¿Es posible asignar el mismo valor a varias claves en un objeto dict a la vez?

{'a': 10, 'b': 20, 'c': 10, 'd': 10, 'e': 20} 

he sido capaz de conseguir esto con éxito mediante la combinación de los dict.update() y dict.fromkeys() funciones de este modo:

myDict = {} 
myDict.update(dict.fromkeys(['a', 'b', 'c'], 10)) 
myDict.update(dict.fromkeys(['b', 'e'], 20)) 

Sin embargo, debido el código se está escribiendo para usuarios novatos que pueden necesitar agregar claves/valores de vez en cuando, prefiero una sintaxis simple (Perl-like) como:

myDict = {} 
myDict['a', 'c', 'd'] = 10 
myDict['b', 'e'] = 20 

Esto, sin embargo, me da:

myDict = {('a', 'c', 'd'): 10, ('b', 'e'): 20} 

¿Hay alguna manera de simplificar mi primer ejemplo (usando dict.update() y dict.fromkeys()) más, y obtener el objeto dict Busco?

O, como alternativa, si tengo un dict con tuplas como en mi segundo ejemplo, ¿hay una manera fácil para hacer una búsqueda como myDict['c'] o myDict.get('c') y obtener el valor 10?

Respuesta

36

yo diría que lo que tienes es muy simple, usted podría mejorar ligeramente que sea:

my_dict = dict.fromkeys(['a', 'b', 'c'], 10) 
my_dict.update(dict.fromkeys(['b', 'e'], 20)) 

Si las llaves están tupla que podría hacer:

>>> my_dict = {('a', 'c', 'd'): 10, ('b', 'e'): 20} 
>>> next(v for k, v in my_dict.items() if 'c' in k)  # use .iteritems() python-2.x 
10 

Esto es, por supuesto, devolverá el primer valor encontrado, la clave para la cual contiene el elemento dado.

+3

El PO dijo que el código está siendo escrito para los principiantes, y esto es relativamente difícil para comprender por un novato. – taleinat

+8

@teleinat: por lo tanto, escriba una función que puedan usar. ¿Me estás degradando seriamente porque mi código no es lo suficientemente estúpido? Mi código está usando métodos y funciones integrados. ¿Cómo es eso no lo básico?¿De qué sirve escribir código para principiantes si no van a aprender de él? – SilentGhost

+1

El OP obviamente sabe cómo programar en Python. Interpreto su pregunta como si hay una solución incorporada más simple para su caso de uso, no si es posible escribir una función de este tipo o lograr lo que quería con código complejo. Por lo tanto, como entiendo, la respuesta de SilentGhost no responde la pregunta, por lo que la rechacé. Mi comentario inicial no describió mi razón para la votación negativa. – taleinat

5

Su primer ejemplo se puede simplificar usando un bucle:

myDict = {} 
for key in ['a', 'c', 'd']: 
    myDict[key] = 10 
for key in ['b', 'e']: 
    myDict[key] = 20 

Sin sintaxis especializada o engaño, y no puedo pensar en otra cosa que sería más fácil de entender.

En cuanto a su segunda pregunta, no hay una manera simple y eficiente de realizar la búsqueda como en su segundo ejemplo. Solo puedo pensar en iterar sobre las claves (tuplas) y verificar si la clave está en alguna de ellas, que no es lo que estás buscando. Quédese con el uso de un dict directo con las claves que desee.

En general, si está buscando un código que los novatos puedan comprender, siga las instrucciones básicas, como las condiciones y los bucles/while.

6

¿Por qué no heredar de dict?

class LazyDict(dict): 
    def keylist(self, keys, value): 
     for key in keys: 
      self[key] = value 

>>> d = LazyDict() 
>>> d.keylist(('a', 'b', 'c'), 10) 
>>> d 
{'a': 10, 'c': 10, 'b': 10} 

pero prefiero solución bucle

1

similares a @SilentGhost sino una sintaxis más declarativa Prefiero:

myDict = { 
    **dict.fromkeys(['a', 'b', 'c'], 10), 
    **dict.fromkeys(['b', 'e'], 20) 
} 
+0

El método de tupla no funciona para myDict.get ('c'), que es de lo que se trataba la pregunta. Este método funciona como se espera, sin agregar código para acceder o definir el diccionario. Esta debería ser la respuesta marcada. – rickfoosusa

Cuestiones relacionadas