adjuntar múltiples valores para una clave en un diccionario

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 es así, agregar el valor a esa lista de valores para la clave específica.

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

2010 2 2009 4 1989 8 2009 7 

Lo que quiero hacer es rellenar un diccionario con los años como claves y esos números de un solo dígito como valores. Sin embargo, si tengo 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 

Ahora mismo 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 

    Si puedo reformular su pregunta, lo que desea 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, ¿verdad? 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]] 

    Lo que debería 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 progtwigción deficiente crear “arreglos paralelos”, donde los elementos se asocian de forma implícita entre sí al tener el mismo índice en lugar de ser hijos apropiados de un contenedor que los abarca a ambos.

    Sería mejor que utilices collections.defaultdict (agregado en Python 2.5). Esto le permite especificar el tipo de objeto predeterminado de una clave que falta (como una list ).

    Entonces, en lugar de crear una clave si no existe primero y luego agregarla al valor de la clave, elimine el intermediario y simplemente agregue directamente a las claves no existentes para obtener el resultado deseado.

    Un ejemplo rápido utilizando sus datos:

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

    De esta manera, no tiene que preocuparse por si ha visto un dígito asociado a un año o no. Simplemente agregue y olvide, sabiendo que una clave faltante siempre será una lista. Si ya existe una clave, simplemente se anexará.

    Puedes usar setdefault .

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

    Esto funciona porque setdefault devuelve la lista y también la configura en el diccionario, y debido a que la lista es mutable, agregar a la versión devuelta por setdefault es lo mismo que agregarla a la versión dentro del propio diccionario. Si eso tiene algún sentido.

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

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

    Aquí hay una forma alternativa de hacerlo usando 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) 

    Es más fácil si obtienes estos valores en una lista de tuplas. Para hacer esto, puedes usar el corte 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 un número arbitrario 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 un valor asociado, o si no hay un valor actual, el valor predeterminado. En este caso, obtendremos una lista vacía o rellenada, a la que luego agregaremos el valor actual.

    Si quieres una (casi) una sola línea:

     De colecciones de importación deque.
    
     d = {}
     deque ((d.setdefault (año, []). añadir (valor) por año, valor en source_of_data), maxlen = 0)
    

    Usando dict.setdefault , puede encapsular la idea de “verificar si la clave ya existe y hacer una nueva lista si no” en una sola llamada. Esto le permite escribir una expresión generadora que es consumida por deque tan eficientemente como sea posible, ya que la longitud de la cola se establece en cero. El deque se descartará inmediatamente y el resultado estará en d .

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