valor resueltos recorrer lista elementos ejercicios diccionarios diccionario dentro convertir buscar agregar actualizar python dictionary key-value

resueltos - añada varios valores para una clave en el diccionario de Python



lista dentro de un diccionario python (7)

Aquí hay una forma alternativa de hacerlo utilizando el operador not in :

# define an empty dict years_dict = dict() for line in list: # here define what key is, for example, key = line[0] # check if key is already present in dict if key not in years_dict: years_dict[key] = [] # append some value years_dict[key].append(some.value)

Esta pregunta ya tiene una respuesta aquí:

Soy nuevo en Python y tengo una lista de años y valores para cada año. Lo que quiero hacer es verificar si el año ya existe en un diccionario y, si lo hace, agregar el valor a esa lista de valores para la clave específica.

Entonces, por ejemplo, tengo una lista de años y tengo un valor por cada año:

2010 2 2009 4 1989 8 2009 7

Lo que quiero hacer es poblar un diccionario con los años como claves y esos números de un solo dígito como valores. Sin embargo, si tengo el 2009 en la lista dos veces, quiero agregar ese segundo valor a mi lista de valores en ese diccionario, así que quiero:

2010: 2 2009: 4, 7 1989: 8

En este momento tengo lo siguiente:

d = dict() years = [] (get 2 column list of years and values) for line in list: year = line[0] value = line[1] for line in list: if year in d.keys(): d[value].append(value) else: d[value] = value d[year] = year


Es más fácil si obtiene estos valores en una lista de tuplas. Para hacer esto, puede usar la división de listas y la función zip.

data_in = [2010,2,2009,4,1989,8,2009,7] data_pairs = zip(data_in[::2],data_in[1::2])

Zip toma una cantidad arbitraria de listas, en este caso las entradas pares e impares de data_in , y las junta en una tupla.

Ahora podemos usar el método setdefault .

data_dict = {} for x in data_pairs: data_dict.setdefault(x[0],[]).append(x[1])

setdefault toma una clave y un valor predeterminado, y devuelve el valor asociado, o si no hay un valor actual, el valor predeterminado. En este caso, obtendremos una lista vacía o poblada, a la que a continuación añadiremos el valor actual.


Lo mejor sería usar collections.defaultdict (agregado en Python 2.5). Esto le permite especificar el tipo de objeto predeterminado de una clave faltante (como una list ).

Entonces, en lugar de crear una clave si no existe primero y luego agregar el valor de la clave, se corta al intermediario y se agrega directamente a las claves no existentes para obtener el resultado deseado.

Un ejemplo rápido usando sus datos:

>>> from collections import defaultdict >>> data = [(2010, 2), (2009, 4), (1989, 8), (2009, 7)] >>> d = defaultdict(list) >>> d defaultdict(<type ''list''>, {}) >>> for year, month in data: ... d[year].append(month) ... >>> d defaultdict(<type ''list''>, {2009: [4, 7], 2010: [2], 1989: [8]})

De esta forma, no tiene que preocuparse si ha visto un dígito asociado con un año o no. Simplemente agrega y olvida, sabiendo que una clave faltante siempre será una lista. Si ya existe una clave, solo se agregará a ella.


Puedes usar setdefault .

for line in list: d.setdefault(year, []).append(value)

Esto funciona porque setdefault devuelve la lista y también la establece en el diccionario, y como una lista es mutable, anexar a la versión devuelta por setdefault es lo mismo que anexarla a la versión dentro del mismo diccionario. Si eso tiene algún sentido.


Si puedo reformular tu pregunta, lo que quieres es un diccionario con los años como claves y una matriz para cada año que contenga una lista de valores asociados con ese año, ¿no? Así es como lo haría:

years_dict = dict() for line in list: if line[0] in years_dict: # append the new number to the existing array at this slot years_dict[line[0]].append(line[1]) else: # create a new array in this slot years_dict[line[0]] = [line[1]]

Con lo que deberías terminar en years_dict es un diccionario que se parece a lo siguiente:

{ "2010": [2], "2009": [4,7], "1989": [8] }

En general, es una práctica de programación deficiente crear "matrices paralelas", donde los elementos se asocian implícitamente entre sí al tener el mismo índice en lugar de ser hijos propios de un contenedor que los abarca a ambos.


Si quieres un (casi) trazador de líneas:

from collections import deque d = {} deque((d.setdefault(year, []).append(value) for year, value in source_of_data), maxlen=0)

Usando dict.detdefault , puede encapsular la idea de "verificar si la clave ya existe y hacer una nueva lista si no es así" en una sola llamada. Esto le permite escribir una expresión de generador que se consume por deque más eficiente posible ya que la longitud de la cola se establece en cero. El deque se descartará inmediatamente y el resultado será en d .

Esto es algo que acabo de hacer por diversión. No recomiendo usarlo. Hay un tiempo y un lugar para consumir iterables arbitrarios a través de un deque, y definitivamente no es así.


d = {} # import list of year,value pairs for year,value in mylist: try: d[year].append(value) except KeyError: d[year] = [value]

La forma de Python: ¡es más fácil recibir perdón que pedir permiso!