Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] ¿Cómo añadir mas valores a todas las claves de un diccionario?

Estas en el tema de ¿Cómo añadir mas valores a todas las claves de un diccionario? en el foro de Python en Foros del Web. Seguramente la respuesta será muy sencilla, pero le doy vueltas y no veo la solución. Quizás, por utilizar en exceso las listas y dejar un ...
  #1 (permalink)  
Antiguo 31/03/2015, 10:44
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
¿Cómo añadir mas valores a todas las claves de un diccionario?

Seguramente la respuesta será muy sencilla, pero le doy vueltas y no veo la solución. Quizás, por utilizar en exceso las listas y dejar un poco de lado los diccionarios.

La idea es leer un archivo de texto donde hay datos. Estos datos se guardan en una lista:

Código Python:
Ver original
  1. lista = [5, 5, 5, 3, 6, 1, 5, 7, 1, 7, 5, 5, 3, 7, 6, 7, 2, 6, 1, 6]

Ahora creo un diccionario donde cada clave toma el valor hasta el máximo dato de la lista:

Código Python:
Ver original
  1. # generamos las claves de 1-7
  2. dic = {}
  3. for x in range(1, 8):    
  4.     dic[x] = []

Código Python:
Ver original
  1. dic
  2. {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []}


Lo que yo quiero, es que al recorrer las claves del diccionario, cada valor se empareje con su clave. Y quede un dibujo asi:

Código Python:
Ver original
  1. dic
  2. {1: [1,1,1], 2: [2], 3: [3,3], 4: [], 5: [5,5,5,5,5,5], 6: [6,6,6,6], 7: [7,7,7,7]}

Se trata de rellenar cada clave con la cantidad de valores de la lista de su mismo número.

El cuerpo del for sería este:

Código Python:
Ver original
  1. for x in lista:
  2.     for j in dic.keys():

En este cuerpo se debería comprobar si x == j. De ser así, se añadiría al valor de su clave correspondiente. Si fuera una lista, lo tendria fácil con el método append. Pero al ser un valor de una clave, no se como añadir mas elementos dentro de esa misma clave.

Pero me he estancado. No puedo utilizar una lista en los valores. Ya que al ser por referencia, me cambia los valores de todas las claves.

Y si hago:

Código Python:
Ver original
  1. dic[1] = [1]

...no se como añadir mas elementos a la lista de cada clave.

¿Alguna ídea?

P.D. Tendré que usar mas los diccionarios...

Última edición por Koan; 31/03/2015 a las 11:00
  #2 (permalink)  
Antiguo 31/03/2015, 11:03
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 1 mes
Puntos: 18
Respuesta: ¿Cómo añadir mas valores a todas las claves de un diccionario?

El valor es una lista, usa append.

Código Python:
Ver original
  1. dict = {}
  2. lista = [5, 5, 5, 3, 6, 1, 5, 7, 1, 7, 5, 5, 3, 7, 6, 7, 2, 6, 1, 6]
  3.  
  4. for x in lista:
  5.     if x in dict:
  6.         dict[x].append(x)
  7.     else: dict[x] = [x]
  8.  
  9. >> print dict
  10. {1: [1, 1, 1], 2: [2], 3: [3, 3], 5: [5, 5, 5, 5, 5, 5], 6: [6, 6, 6, 6], 7: [7, 7, 7, 7]}

Saludos.
  #3 (permalink)  
Antiguo 31/03/2015, 11:25
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: ¿Cómo añadir mas valores a todas las claves de un diccionario?

¡Muchas gracias! Desde luego que no sabía que se podía usar append de esa manera en un diccionario:

Código Python:
Ver original
  1. dict[x].append(x)

Aunque en todo caso el código lo he dejado así:

Código Python:
Ver original
  1. dic = {}
  2. for x in range(1, 8):    
  3.     dic[x] = []
  4.  
  5. for x in lista:
  6.     if x in dic:
  7.         dic[x].append(x)

Le he eliminado el else. Ya que me interesa que tenga también la key 4, aun cuando no salga en la lista.

Se trata de tener los números del 1 al 7 (como keys) , y ver con que frecuencia se repiten dentro de la lista. Y claro, para eso se debe tener también la key 4.

RESULTADO:

Código Python:
Ver original
  1. dic
  2. {1: [1, 1, 1], 2: [2], 3: [3, 3], 4: [], 5: [5, 5, 5, 5, 5, 5], 6: [6, 6, 6, 6], 7: [7, 7, 7, 7]}

Cómo puede verse, la key 4 esta vacía. Pero se puede cargar otro fichero de texto y que si incluya valores de 4.

Ahora, haciendo:

Código Python:
Ver original
  1. len(dic[5])
Nos dice que el 5 se repite 6 veces.

Aunque me estudiare tu código para que me quede bien claro. Por que has utilizado una built-in para crear el diccionario ¿No es mejor darle un nombre?

Última edición por Koan; 31/03/2015 a las 11:31
  #4 (permalink)  
Antiguo 31/03/2015, 11:52
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 1 mes
Puntos: 18
Respuesta: ¿Cómo añadir mas valores a todas las claves de un diccionario?

Tienes razón, error mio.
  #5 (permalink)  
Antiguo 31/03/2015, 14:34
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: ¿Cómo añadir mas valores a todas las claves de un diccionario?

Hay varias formas de hacerlo.

1. Diccionarios planos: Tal como lo pusieron arriba

2. defaultdict
Código Python:
Ver original
  1. from collections import defaultdict
  2. lista = [5, 5, 5, 3, 6, 1, 5, 7, 1, 7, 5, 5, 3, 7, 6, 7, 2, 6, 1, 6]
  3. d = defaultdict(list)
  4. for i in lista:
  5.     d[i].append(i)
  6. print d

3. Groupby para esto es importante que la lista se encuentre ordenada
Código Python:
Ver original
  1. from itertools import groupby
  2. lista = [5, 5, 5, 3, 6, 1, 5, 7, 1, 7, 5, 5, 3, 7, 6, 7, 2, 6, 1, 6]
  3. lista.sort()
  4. g = groupby(lista)
  5. for k, v in g:
  6.     print k, list(v)
  #6 (permalink)  
Antiguo 01/04/2015, 02:24
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: ¿Cómo añadir mas valores a todas las claves de un diccionario?

Muchas gracias, razpeitia. Me guardare también esta forma de crear los diccionarios para futuros usos. Siempre intento recurrir a las menos librerias posibles. Mas que nada, para profundizar mas en lo que viene de 'serie' en Python.

Esta claro que la clave es lo que citaba mas arriba, como me comentó sukoy, en esta línea:

Código Python:
Ver original
  1. dic[x].append(x)

Como desconocía que se podía hacer eso, le daba vueltas y mas vueltas.

Ahora si cargamos otro fichero de texto, y añadimos este código:

Código Python:
Ver original
  1. for clave, valor in enumerate(dic.values(), 1):
  2.     print(clave, valor, 'Total: ', len(valor))

Tenemos esta salida:

Código Python:
Ver original
  1. 1 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] Total:  14
  2. 2 [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] Total:  13
  3. 3 [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] Total:  17
  4. 4 [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] Total:  13
  5. 5 [5, 5, 5, 5, 5, 5] Total:  6
  6. 6 [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6] Total:  23
  7. 7 [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7] Total:  14

¡Saludos!

Etiquetas: claves, todas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:14.