Respuestas:
d = {'key': 'value'}
print(d)
# {'key': 'value'}
d['mynewkey'] = 'mynewvalue'
print(d)
# {'key': 'value', 'mynewkey': 'mynewvalue'}
.update()
método? ¿Cuál es mejor cuando?
d[key]=val
sintaxis, ya que es más corta y puede manejar cualquier objeto como clave (siempre que sea hashable), y solo establece un valor, mientras que .update(key1=val1, key2=val2)
es mejor si desea establecer varios valores al mismo tiempo, siempre que las claves son cadenas (ya que los kwargs se convierten en cadenas). dict.update
también puede tomar otro diccionario, pero personalmente prefiero no crear explícitamente un nuevo diccionario para actualizar otro.
$foo[ ] = [ . . . . ]
Para agregar varias claves simultáneamente, use dict.update()
:
>>> x = {1:2}
>>> print(x)
{1: 2}
>>> d = {3:4, 5:6, 7:8}
>>> x.update(d)
>>> print(x)
{1: 2, 3: 4, 5: 6, 7: 8}
Para agregar una sola clave, la respuesta aceptada tiene menos sobrecarga computacional.
x[-1] = 44
el -1
valor también está al final. De todos modos la respuesta ha sido editada y ahora es mucho mejor. Actualizar con un diccionario es bueno cuando es probable que contenga muchos elementos.
Tengo ganas de consolidar información sobre los diccionarios Python:
data = {}
# OR
data = dict()
data = {'a': 1, 'b': 2, 'c': 3}
# OR
data = dict(a=1, b=2, c=3)
# OR
data = {k: v for k, v in (('a', 1), ('b',2), ('c',3))}
data['a'] = 1 # Updates if 'a' exists, else adds 'a'
# OR
data.update({'a': 1})
# OR
data.update(dict(a=1))
# OR
data.update(a=1)
data.update({'c':3,'d':4}) # Updates 'c' and adds 'd'
data3 = {}
data3.update(data) # Modifies data3, not data
data3.update(data2) # Modifies data3, not data2
del data[key] # Removes specific element in a dictionary
data.pop(key) # Removes the key & returns the value
data.clear() # Clears entire dictionary
key in data
for key in data: # Iterates just through the keys, ignoring the values
for key, value in d.items(): # Iterates through the pairs
for key in d.keys(): # Iterates just through key, ignoring the values
for value in d.values(): # Iterates just through value, ignoring the keys
data = dict(zip(list_with_keys, list_with_values))
Esto utiliza un nuevo featrue llamado diccionario desempaquetado .
data = {**data1, **data2, **data3}
El operador de actualización |=
ahora funciona para los diccionarios:
data |= {'c':3,'d':4}
El operador de combinación |
ahora funciona para los diccionarios:
data = data1 | {'c':3,'d':4}
¡Siéntase libre de agregar más!
"¿Es posible agregar una clave a un diccionario de Python después de que se haya creado? No parece tener un método .add ()".
Sí, es posible, y tiene un método que implementa esto, pero no desea usarlo directamente.
Para demostrar cómo y cómo no usarlo, creemos un dict vacío con el literal dict {}
:
my_dict = {}
Para actualizar este dict con una sola clave y valor nuevos, puede usar la notación de subíndice (consulte Asignaciones aquí) que proporciona la asignación de elementos:
my_dict['new key'] = 'new value'
my_dict
es ahora:
{'new key': 'new value'}
update
método - 2 formasTambién podemos actualizar el dict con múltiples valores de manera eficiente también mediante el update
método . Es posible que dict
estemos creando innecesariamente un extra aquí, por lo que esperamos que el nuestro dict
ya haya sido creado y provenga o haya sido utilizado para otro propósito:
my_dict.update({'key 2': 'value 2', 'key 3': 'value 3'})
my_dict
es ahora:
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value'}
Otra forma eficiente de hacer esto con el método de actualización es con argumentos de palabras clave, pero dado que tienen que ser palabras legítimas de Python, no puede tener espacios o símbolos especiales o comenzar el nombre con un número, pero muchos consideran que es una forma más legible para crear claves para un dict, y aquí ciertamente evitamos crear un innecesario adicional dict
:
my_dict.update(foo='bar', foo2='baz')
y my_dict
ahora es:
{'key 2': 'value 2', 'key 3': 'value 3', 'new key': 'new value',
'foo': 'bar', 'foo2': 'baz'}
Así que ahora hemos cubierto tres formas pitónicas de actualizar a dict
.
__setitem__
y por qué debería evitarseHay otra forma de actualizar una dict
que no deberías usar, que usa el __setitem__
método. Aquí hay un ejemplo de cómo se podría usar el __setitem__
método para agregar un par clave-valor a un dict
, y una demostración del bajo rendimiento de su uso:
>>> d = {}
>>> d.__setitem__('foo', 'bar')
>>> d
{'foo': 'bar'}
>>> def f():
... d = {}
... for i in xrange(100):
... d['foo'] = i
...
>>> def g():
... d = {}
... for i in xrange(100):
... d.__setitem__('foo', i)
...
>>> import timeit
>>> number = 100
>>> min(timeit.repeat(f, number=number))
0.0020880699157714844
>>> min(timeit.repeat(g, number=number))
0.005071878433227539
Entonces vemos que usar la notación de subíndice es en realidad mucho más rápido que usarlo __setitem__
. Hacer lo Pythonic, es decir, usar el lenguaje de la manera en que se pretendía usar, generalmente es más legible y computacionalmente eficiente.
d.__setitem__
), aunque la conclusión (y especialmente la última oración) sigue siendo sólida. Levantar la búsqueda del nombre del método fuera del ciclo redujo el tiempo a aproximadamente 1.65 ms; la diferencia restante probablemente se deba en gran medida a la inevitable sobrecarga del mecanismo de llamada de Python.
dictionary[key] = value
Si desea agregar un diccionario dentro de un diccionario, puede hacerlo de esta manera.
Ejemplo: Agregue una nueva entrada a su diccionario y sub diccionario
dictionary = {}
dictionary["new key"] = "some new entry" # add new dictionary entry
dictionary["dictionary_within_a_dictionary"] = {} # this is required by python
dictionary["dictionary_within_a_dictionary"]["sub_dict"] = {"other" : "dictionary"}
print (dictionary)
Salida:
{'new key': 'some new entry', 'dictionary_within_a_dictionary': {'sub_dict': {'other': 'dictionarly'}}}
NOTA: Python requiere que primero agregue un sub
dictionary["dictionary_within_a_dictionary"] = {}
antes de agregar entradas.
dictionary = {"dictionary_within_a_dictionary": {"sub_dict": {"other" : "dictionary"}}}
(o si dictionary
ya es un dict, dictionary["dictionary_within_a_dictionary"] = {"sub_dict": {"other" : "dictionary"}}
)
La sintaxis ortodoxa es d[key] = value
, pero si a su teclado le faltan las teclas de corchetes, puede hacer:
d.__setitem__(key, value)
De hecho, definiendo __getitem__
y __setitem__
métodos es cómo puede hacer que su propia clase admita la sintaxis de corchetes. Ver https://python.developpez.com/cours/DiveIntoPython/php/endiveintopython/object_oriented_framework/special_class_methods.php
[a for a in my_dict if my_dict.update({'a': 1}) is None]
.
{v: k for k, v in my_dict.items() if <some_conditional_check>}
Esta popular pregunta aborda métodos funcionales de fusión de diccionarios a
y b
.
Estos son algunos de los métodos más directos (probados en Python 3) ...
c = dict( a, **b ) ## see also https://stackoverflow.com/q/2255878
c = dict( list(a.items()) + list(b.items()) )
c = dict( i for d in [a,b] for i in d.items() )
Nota: El primer método anterior solo funciona si las claves b
son cadenas.
Para agregar o modificar un solo elemento , el b
diccionario contendría solo ese elemento ...
c = dict( a, **{'d':'dog'} ) ## returns a dictionary based on 'a'
Esto es equivalente a ...
def functional_dict_add( dictionary, key, value ):
temp = dictionary.copy()
temp[key] = value
return temp
c = functional_dict_add( a, 'd', 'dog' )
c = dict( a, **{'d':'dog'} )
sería mejor escribirlo c = dict(a, d='dog')
, siempre que las claves sean conocidas y no se calculen.
Supongamos que desea vivir en el mundo inmutable y NO desea modificar el original, pero desea crear uno nuevo dict
que sea el resultado de agregar una nueva clave al original.
En Python 3.5+ puedes hacer:
params = {'a': 1, 'b': 2}
new_params = {**params, **{'c': 3}}
El equivalente de Python 2 es:
params = {'a': 1, 'b': 2}
new_params = dict(params, **{'c': 3})
Después de cualquiera de estos:
params
sigue siendo igual a {'a': 1, 'b': 2}
y
new_params
es igual a {'a': 1, 'b': 2, 'c': 3}
Habrá ocasiones en que no desee modificar el original (solo desea el resultado de agregarlo al original). Me parece una alternativa refrescante a lo siguiente:
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params['c'] = 3
o
params = {'a': 1, 'b': 2}
new_params = params.copy()
new_params.update({'c': 3})
Referencia: https://stackoverflow.com/a/2255892/514866
**
Python (muchos no lo están), entonces no será obvio lo que está sucediendo. Hay momentos en que favorecerá un enfoque menos funcional para una mejor legibilidad.
Tantas respuestas y aún así todos se olvidaron de los nombres extraños, de comportamiento extraño, y aún así útiles. dict.setdefault()
Esta
value = my_dict.setdefault(key, default)
básicamente solo hace esto:
try:
value = my_dict[key]
except KeyError: # key not found
value = my_dict[key] = default
p.ej
>>> mydict = {'a':1, 'b':2, 'c':3}
>>> mydict.setdefault('d', 4)
4 # returns new value at mydict['d']
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # a new key/value pair was indeed added
# but see what happens when trying it on an existing key...
>>> mydict.setdefault('a', 111)
1 # old value was returned
>>> print(mydict)
{'a':1, 'b':2, 'c':3, 'd':4} # existing key was ignored
Si no está uniendo dos diccionarios, pero está agregando nuevos pares clave-valor a un diccionario, entonces usar la notación de subíndice parece ser la mejor manera.
import timeit
timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary.update({"aaa": 123123, "asd": 233})')
>> 0.49582505226135254
timeit.timeit('dictionary = {"karga": 1, "darga": 2}; dictionary["aaa"] = 123123; dictionary["asd"] = 233;')
>> 0.20782899856567383
Sin embargo, si desea agregar, por ejemplo, miles de nuevos pares clave-valor, debería considerar usar el update()
método.
Creo que también sería útil señalar el collections
módulo de Python que consta de muchas subclases de diccionario y envoltorios útiles que simplifican la adición y modificación de tipos de datos en un diccionario , específicamente defaultdict
:
dict subclase que llama a una función de fábrica para suministrar valores faltantes
Esto es particularmente útil si está trabajando con diccionarios que siempre consisten en los mismos tipos de datos o estructuras, por ejemplo, un diccionario de listas.
>>> from collections import defaultdict
>>> example = defaultdict(int)
>>> example['key'] += 1
>>> example['key']
defaultdict(<class 'int'>, {'key': 1})
Si la clave aún no existe, defaultdict
asigna el valor dado (en nuestro caso 10
) como valor inicial al diccionario (a menudo utilizado dentro de los bucles). Por lo tanto, esta operación hace dos cosas: agrega una nueva clave a un diccionario (según la pregunta) y asigna el valor si la clave aún no existe. Con el diccionario estándar, esto habría generado un error ya que la +=
operación está intentando acceder a un valor que aún no existe:
>>> example = dict()
>>> example['key'] += 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'key'
Sin el uso de defaultdict
, la cantidad de código para agregar un nuevo elemento sería mucho mayor y quizás se parece a:
# This type of code would often be inside a loop
if 'key' not in example:
example['key'] = 0 # add key and initial value to dict; could also be a list
example['key'] += 1 # this is implementing a counter
defaultdict
también se puede usar con tipos de datos complejos como list
y set
:
>>> example = defaultdict(list)
>>> example['key'].append(1)
>>> example
defaultdict(<class 'list'>, {'key': [1]})
Agregar un elemento automáticamente inicializa la lista.
Aquí hay otra forma que no vi aquí:
>>> foo = dict(a=1,b=2)
>>> foo
{'a': 1, 'b': 2}
>>> goo = dict(c=3,**foo)
>>> goo
{'c': 3, 'a': 1, 'b': 2}
Puede usar el constructor de diccionario y la expansión implícita para reconstruir un diccionario. Además, curiosamente, este método puede usarse para controlar el orden posicional durante la construcción del diccionario ( posterior a Python 3.6 ). De hecho, ¡el orden de inserción está garantizado para Python 3.7 y superior!
>>> foo = dict(a=1,b=2,c=3,d=4)
>>> new_dict = {k: v for k, v in list(foo.items())[:2]}
>>> new_dict
{'a': 1, 'b': 2}
>>> new_dict.update(newvalue=99)
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99}
>>> new_dict.update({k: v for k, v in list(foo.items())[2:]})
>>> new_dict
{'a': 1, 'b': 2, 'newvalue': 99, 'c': 3, 'd': 4}
>>>
Lo anterior está utilizando la comprensión del diccionario.
primero para verificar si la clave ya existe
a={1:2,3:4}
a.get(1)
2
a.get(5)
None
entonces puede agregar la nueva clave y valor
agregar clave de diccionario, clase de valor.
class myDict(dict):
def __init__(self):
self = dict()
def add(self, key, value):
#self[key] = value # add new key and value overwriting any exiting same key
if self.get(key)!=None:
print('key', key, 'already used') # report if key already used
self.setdefault(key, value) # if key exit do nothing
## example
myd = myDict()
name = "fred"
myd.add('apples',6)
print('\n', myd)
myd.add('bananas',3)
print('\n', myd)
myd.add('jack', 7)
print('\n', myd)
myd.add(name, myd)
print('\n', myd)
myd.add('apples', 23)
print('\n', myd)
myd.add(name, 2)
print(myd)
{**mydict, 'new_key': new_val}
.