Foros del Web » Programando para Internet » Python »

Diccionario dentro de un diccionario...

Estas en el tema de Diccionario dentro de un diccionario... en el foro de Python en Foros del Web. Buenas a todos, sigo aquí con mis dudas de novato en python. Os explico: Necesito guardar datos de un diccionario B dentro de un diccionario ...
  #1 (permalink)  
Antiguo 01/06/2010, 11:31
Avatar de Nekeniehl  
Fecha de Ingreso: julio-2009
Ubicación: Berlin, Alemania / Granada, España
Mensajes: 132
Antigüedad: 15 años, 4 meses
Puntos: 6
Diccionario dentro de un diccionario...

Buenas a todos, sigo aquí con mis dudas de novato en python. Os explico:

Necesito guardar datos de un diccionario B dentro de un diccionario A, ejemplifico con mi código:
Código Python:
Ver original
  1. msg={}
  2.     tmsg={}
  3.     total = mails.select('INBOX')
  4.     for num in range(int(total[1][0])):
  5. #        Headers from the message
  6.         typ, msg_data = mails.fetch(num+1, '(BODY.PEEK[HEADER])')
  7.         fro = msg_data[0][1].split("From: ")[1].split("\r\n")[0]
  8.         msg[str(num)+"from"] = fro
  9.         sub = msg_data[0][1].split("Subject: ")[1].split("\r\n")[0]
  10.         msg[str(num)+"subject"] = sub
  11.         to = msg_data[0][1].split ("To: ")[1].split("\r\n")[0]
  12.         msg[str(num)+"to"] = to
  13. #        Text from the message
  14.         typ, msg_data = mails.fetch(num+1, '(BODY.PEEK[TEXT])')
  15.         text = msg_data[0][1].split("\r\n")[0]
  16.         msg[str(num)+"text"] = text
  17.         tmsg[num]=msg

El problema está en que tmsg donde diferencio los mensajes con una key numerica dada por la variable num, se guardan los mismos datos que contenga el último mensaje recuperado en el diccionario msg...
Y no lo entiendo..Necesito poder guardar todos los mensajes en un solo diccionario, alguna idea?
__________________
Antes de cambiar el mundo...dá tres vueltas por tu casa

Usa Google es tu amigo ;)
  #2 (permalink)  
Antiguo 02/06/2010, 05:36
Avatar de Nekeniehl  
Fecha de Ingreso: julio-2009
Ubicación: Berlin, Alemania / Granada, España
Mensajes: 132
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Diccionario dentro de un diccionario...

¿Nadie puede ayudarme?, ¿La única forma que hay es crear un diccionario para cada mensaje?, eso me lleva a otra pregunta..¿Existe la creación de variables "variables" en python? del modo que el identificador de una variable junto con el identificador de otra (por ejemplo num en mi caso) formen una nueva, ¿Sugerencias?, Un saludo
__________________
Antes de cambiar el mundo...dá tres vueltas por tu casa

Usa Google es tu amigo ;)
  #3 (permalink)  
Antiguo 02/06/2010, 08:53
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Diccionario dentro de un diccionario...

No termino de entender bien el código, debo admitir que no le he prestado la atención suficiente (se hace difícil cuando uno no sabe lo que hace el programa). Sin embargo, si no me equivoco, la estructura es así:

Código Python:
Ver original
  1. msg = {}
  2. for num in range(X):
  3.     # se agregan claves a msg
  4.     tmsg[num] = msg

Y decís que todas las entradas de tmsg contienen el último mensaje recuperado. El problema es que msg es *siempre* el mismo diccionario, ya que se inicializa solamente una vez fuera del bucle. Luego vas cambiando los valores de cada clave, pero msg sigue apuntando al mismo diccionario y por lo tanto en cada tmsg[num] estás guardando una referencia a la misma estructura, cuyos datos son sobrescritos en cada iteración.

Solución: crea un nuevo msg en cada paso del bucle, moviendo la inicialización dentro del for:

Código Python:
Ver original
  1. for num in range(X):
  2.     msg = {}
  3.     # se agregan claves a msg
  4.     tmsg[num] = msg

Si con lo de "variables variables" te referís a lo que puede hacer php:
Código PHP:
Ver original
  1. $cosa="Hola"
  2. $$cosa crea una variable $Hola

No existe tal cosa. Va en contra de la simpleza y elegancia que los desarrolladores de Python pretenden darle al lenguaje. Podés jugar, si te resulta útil, con las claves de un diccionario: http://stackoverflow.com/questions/1...bles-in-python


Saludos.
  #4 (permalink)  
Antiguo 02/06/2010, 09:14
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Diccionario dentro de un diccionario...

Mira, yo tampoco entiendo bien el código, mas por que estas utilizando alguna clase o modulo que no sabemos lo que hace.

Pero si tienes 2 listas, por ejemplo de la siguiente manera:
Código Python:
Ver original
  1. l1 = ["Mensaje1", "Mensaje2", "Mensaje3"]
  2. l2 = [("Contenido1.0", "Contenido1.1"), ("Contenido2.0", "Contenido2.1"), ("Contenido3.0", "Contenido3.1",)]
  3.  
  4. #Puedes usar la función zip y dict, para crear un diccionario:
  5. d1 = dict(zip(l1, l2))
  6. #d1 = {'Mensaje1': ('Contenido1.0', 'Contenido1.1'), 'Mensaje3': ('Contenido3.0', 'Contenido3.1'), 'Mensaje2':  'Contenido2.0', 'Contenido2.1')}
  #5 (permalink)  
Antiguo 02/06/2010, 09:40
Avatar de Nekeniehl  
Fecha de Ingreso: julio-2009
Ubicación: Berlin, Alemania / Granada, España
Mensajes: 132
Antigüedad: 15 años, 4 meses
Puntos: 6
Respuesta: Diccionario dentro de un diccionario...

Pues si, los dos me habéis dado soluciones óptimas, gracias =D

El código completo de la función es este:
Código Python:
Ver original
  1. def CatchAll ():
  2.     """Catch all msg from the email Catch-all
  3.    Return values from, to, text, subject"""
  4.     host = cfg.get('Connection','host')
  5.     user = cfg.get('Connection','user')
  6.     pwd = cfg.get('Connection','pwd')
  7.  
  8.     mails = imaplib.IMAP4(host)
  9.     mails.login(user,pwd)
  10.     tmsg ={}
  11.     total = mails.select('INBOX')
  12.     for num in range(int(total[1][0])):
  13.         msg = {}
  14. #        Headers from the message
  15.         typ, msg_data = mails.fetch(num+1, '(BODY.PEEK[HEADER])')
  16.         fro = msg_data[0][1].split("From: ")[1].split("\r\n")[0]
  17.         msg["from"] = fro
  18.         sub = msg_data[0][1].split("Subject: ")[1].split("\r\n")[0]
  19.         msg["subject"] = sub
  20.         to = msg_data[0][1].split ("To: ")[1].split("\r\n")[0]
  21.         msg["to"] = to
  22. #        Text from the message
  23.         typ, msg_data = mails.fetch(num+1, '(BODY.PEEK[TEXT])')
  24.         text = msg_data[0][1].split("\r\n")[0]
  25.         msg["text"] = text
  26.         tmsg[num] = msg
  27.  
  28.     mails.close()
  29.     mails.logout()
  30.     return tmsg
Ya que estoy trabajando en un programilla que te recupera los senders y los recipients de una cuenta a la que van todos los mensajes del foro ya sean a la dirección de correo normal del usuario o la dirección de correo del dominio de dicho usuario, para convertirlos en mensajes personales dentro del foro.. xD, todavía me queda, pero voy en buen camino, gracias por vuestra ayuda =D
__________________
Antes de cambiar el mundo...dá tres vueltas por tu casa

Usa Google es tu amigo ;)

Etiquetas: diccionario
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 20:16.