Foros del Web » Programando para Internet » Python »

Ayuda - Cambiar nombre de diccionario

Estas en el tema de Ayuda - Cambiar nombre de diccionario en el foro de Python en Foros del Web. Hola a todos. Tras leer documentación de Python 3, estoy desarrollando mi primer programa con licencia GPL. Debido a mis conocimientos me he topado con ...
  #1 (permalink)  
Antiguo 13/08/2009, 07:47
 
Fecha de Ingreso: junio-2007
Mensajes: 2
Antigüedad: 16 años, 10 meses
Puntos: 0
Pregunta Ayuda - Cambiar nombre de diccionario

Hola a todos. Tras leer documentación de Python 3, estoy desarrollando mi primer programa con licencia GPL.

Debido a mis conocimientos me he topado con un problema que aún no he conseguido resolver solo y me esta matando debido a que tiene que ser probablemente muy sencillo. Este módulo del programa crea un diccionario y le asigna una serie de valores a unas características que se preguntan al usuario.

El problema es que al principio del programa quiero que el nombre del diccionario se asigne al siguiente nombre: dic_ y seguidamente el nombre que introduzca el usuario. He estado probando algunas cosas pero no consigo avanzar.

El modulo es el siguiente:


Código:
#Se crea un diccionario para el personaje
dic_personaje = {'fuerza': 0, 'resistencia': 0, 'destreza': 0, 'inteligencia': 0, 'percepcion': 0} #Se crea un diccionario para los atributos

#FUERZA
while dic_personaje['fuerza'] == 0: #Mientras el valor de fuerza sea 0, se preguntará por un valor valido para fuerza.
    dic_personaje['fuerza'] = eval(input("Fuerza: "))
    
    if dic_personaje['fuerza'] <= 10:   #Si el numero es menor o igual que 10...
        if dic_personaje['fuerza'] >= 2:#Y mayor o igual que 2...
            print("Ok")                 #...es correcto.
            
    if dic_personaje['fuerza'] > 10 or dic_personaje['fuerza'] < 2:#Si el numero es mayor de 10 o menor de 2...
        if dic_personaje['fuerza'] > 10:
            print("El máximo son 10 puntos. ")#Si es mayor de 10 puntos te avisa con este mensaje.
        if dic_personaje['fuerza'] < 2:
            print("El mínimo son 2 puntos. ")#Si es menor de 2 puntos te avisa con este mensaje.
        dic_personaje['fuerza'] = 0 #El atributo se restablece a 0 para volver a solicitar hasta que se introduzca un  numero valido

#RESISTENCIA
while dic_personaje['resistencia'] == 0: 
    dic_personaje['resistencia'] = eval(input("Resistencia: "))
    
    if dic_personaje['resistencia'] <= 10:
        if dic_personaje['resistencia'] >= 2:
            print("Ok")
            
    if dic_personaje['resistencia'] > 10 or dic_personaje['resistencia'] < 2:
        if dic_personaje['resistencia'] > 10:
            print("El máximo son 10 puntos. ")
        if dic_personaje['resistencia'] < 2:
            print("El mínimo son 2 puntos. ")
        dic_personaje['resistencia'] = 0

#DESTREZA
while dic_personaje['destreza'] == 0: 
    dic_personaje['destreza'] = eval(input("Destreza: "))
    
    if dic_personaje['destreza'] <= 10:
        if dic_personaje['destreza'] >= 2:
            print("Ok")
            
    if dic_personaje['destreza'] > 10 or dic_personaje['destreza'] < 2:
        if dic_personaje['destreza'] > 10:
            print("El máximo son 10 puntos. ")
        if dic_personaje['destreza'] < 2:
            print("El mínimo son 2 puntos. ")
        dic_personaje['destreza'] = 0

#INTELIGENCIA
while dic_personaje['inteligencia'] == 0: 
    dic_personaje['inteligencia'] = eval(input("Inteligencia: "))
    
    if dic_personaje['inteligencia'] <= 10:
        if dic_personaje['inteligencia'] >= 2:
            print("Ok")
            
    if dic_personaje['inteligencia'] > 10 or dic_personaje['inteligencia'] < 2:
        if dic_personaje['inteligencia'] > 10:
            print("El máximo son 10 puntos. ")
        if dic_personaje['inteligencia'] < 2:
            print("El mínimo son 2 puntos. ")
        dic_personaje['inteligencia'] = 0

#PERCEPCIÓN
while dic_personaje['percepcion'] == 0: 
    dic_personaje['percepcion'] = eval(input("Percepcion: "))
    
    if dic_personaje['percepcion'] <= 10:
        if dic_personaje['percepcion'] >= 2:
            print("Ok")
            
    if dic_personaje['percepcion'] > 10 or dic_personaje['percepcion'] < 2:
        if dic_personaje['percepcion'] > 10:
            print("El máximo son 10 puntos. ")
        if dic_personaje['percepcion'] < 2:
            print("El mínimo son 2 puntos. ")
        dic_personaje['percepcion'] = 0

#Se suman todos los atributos y se asignan a la variable total_puntos
total_puntos = dic_personaje['fuerza'] + dic_personaje['resistencia'] + dic_personaje['destreza'] + dic_personaje['inteligencia'] + dic_personaje['percepcion']

if total_puntos <= 40:
    if total_puntos < 40:
        print("te faltan puntos por asignar")
    if total_puntos == 40:
        print("puntos asignados")
    
if total_puntos > 40:
    print("te has pasado de puntos")
El nombre de usuario lo solicito con input pero ahi me quedo.
Por cierto que si alguien tiene alguna idea para mejorar el código tambien es de agradecer.

Un saludo
  #2 (permalink)  
Antiguo 13/08/2009, 12:04
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: Ayuda - Cambiar nombre de diccionario

Tu código "mejorado"
Código python:
Ver original
  1. #Se crea un diccionario para el personaje
  2. dic_personaje = {'fuerza': 0, 'resistencia': 0, 'destreza': 0, 'inteligencia': 0, 'percepcion': 0} #Se crea un diccionario para los atributos
  3.  
  4. #FUERZA
  5. while not dic_personaje['fuerza']: #Mientras el valor de fuerza sea 0, se preguntará por un valor valido para fuerza.
  6.     dic_personaje['fuerza'] = int(input("Fuerza: ")) #Eval es demasiado poderoso, ojo valida tus entradas...
  7.         if dic_personaje['fuerza'] > 10:
  8.             print("El máximo son 10 puntos. ")#Si es mayor de 10 puntos te avisa con este mensaje.
  9.         elif dic_personaje['fuerza'] < 2:
  10.             print("El mínimo son 2 puntos. ")#Si es menor de 2 puntos te avisa con este mensaje.
  11.         if dic_personaje['fuerza'] > 10 or dic_personaje['fuerza'] < 2:
  12.             dic_personaje['fuerza'] = 0 #El atributo se restablece a 0 para volver a solicitar hasta que se introduzca un  numero valido
  13.             continue #Continua el ciclo sin, pasar por las demas instrucciones
  14.         print("Ok")
  15.  
  16. #RESISTENCIA
  17. while not dic_personaje['resistencia']:
  18.     dic_personaje['resistencia'] = int(input("Resistencia: "))
  19.  
  20.     if dic_personaje['resistencia'] > 10:
  21.         print("El máximo son 10 puntos. ")
  22.     if dic_personaje['resistencia'] < 2:
  23.         print("El mínimo son 2 puntos. ")
  24.  
  25.     if dic_personaje['resistencia'] > 10 or dic_personaje['resistencia'] < 2:
  26.         dic_personaje['resistencia'] = 0
  27.         continue
  28.     print("Ok")
  29.  
  30. #DESTREZA
  31. while not dic_personaje['destreza']:
  32.     dic_personaje['destreza'] = int(input("Destreza: "))        
  33.            
  34.     if dic_personaje['destreza'] > 10:
  35.         print("El máximo son 10 puntos. ")
  36.     if dic_personaje['destreza'] < 2:
  37.         print("El mínimo son 2 puntos. ")
  38.     if dic_personaje['destreza'] > 10 or dic_personaje['destreza'] < 2:
  39.         dic_personaje['destreza'] = 0
  40.         continue
  41.     print("Ok")
  42.  
  43. #INTELIGENCIA
  44. while not dic_personaje['inteligencia']:
  45.     dic_personaje['inteligencia'] = int(input("Inteligencia: "))            
  46.  
  47.     if dic_personaje['inteligencia'] > 10:
  48.         print("El máximo son 10 puntos. ")
  49.     elif dic_personaje['inteligencia'] < 2:
  50.         print("El mínimo son 2 puntos. ")
  51.     if dic_personaje['inteligencia'] > 10 or dic_personaje['inteligencia'] < 2:
  52.         dic_personaje['inteligencia'] = 0
  53.         continue
  54.     print("Ok")
  55.  
  56. #PERCEPCIÓN
  57. while not dic_personaje['percepcion']:
  58.     dic_personaje['percepcion'] = int(input("Percepcion: "))
  59.            
  60.     if dic_personaje['percepcion'] > 10:
  61.         print("El máximo son 10 puntos. ")
  62.     elif dic_personaje['percepcion'] < 2:
  63.         print("El mínimo son 2 puntos. ")
  64.     if dic_personaje['percepcion'] > 10 or dic_personaje['percepcion'] < 2:
  65.         dic_personaje['percepcion'] = 0
  66.     print("Ok")
  67.  
  68. #Se suman todos los atributos y se asignan a la variable total_puntos
  69. total_puntos = dic_personaje['fuerza'] + dic_personaje['resistencia'] + dic_personaje['destreza'] + dic_personaje['inteligencia'] + dic_personaje['percepcion']
  70.  
  71. if total_puntos < 40:
  72.     print("te faltan puntos por asignar")
  73. elif total_puntos > 40:
  74.     print("te has pasado de puntos")
  75. else:
  76.     print("puntos asignados")

Mi codigo:
Código python:
Ver original
  1. #Se crea un diccionario para el personaje
  2. dic_personaje = {'fuerza': 0, 'resistencia': 0, 'destreza': 0, 'inteligencia': 0, 'percepcion': 0} #Se crea un diccionario para los atributos
  3.  
  4. #FUERZA
  5. def get_skill(text):
  6.     skill = 0
  7.     while not skill:
  8.         while True:
  9.             s = ""
  10.             try:
  11.                 s = int(input(text))
  12.             except ValueError:
  13.                 print ("Por favor, introduzca un numero, diferente de 0")
  14.             finally:
  15.                 if s:
  16.                     break
  17.         skill = s
  18.         if skill > 10:
  19.             print("El máximo son 10 puntos. ")#Si es mayor de 10 puntos te avisa con este mensaje.
  20.         elif skill < 2:
  21.             print("El mínimo son 2 puntos. ")#Si es menor de 2 puntos te avisa con este mensaje.
  22.         if skill > 10 or skill < 2:
  23.             skill = 0 #El atributo se restablece a 0 para volver a solicitar hasta que se introduzca un  numero valido
  24.         else:
  25.             print("Ok")
  26.             return skill
  27.  
  28. total = 0
  29. for i in dic_personaje.keys():
  30.     print("%s %s"%(type(total), type(dic_personaje[i])))
  31.     dic_personaje[i] = get_skill("%s:  "%i)
  32.     total += dic_personaje[i]
  33.  
  34. if total < 40:
  35.     print("te faltan puntos por asignar")
  36. elif total > 40:
  37.     print("te has pasado de puntos")
  38. else:
  39.     print("puntos asignados")

Ya no ejecute el codigo, pero por lo menos el mio debe de jalar :p
  #3 (permalink)  
Antiguo 18/08/2009, 09:19
Usuario no validado
 
Fecha de Ingreso: septiembre-2008
Ubicación: Cuba
Mensajes: 34
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Ayuda - Cambiar nombre de diccionario

Hola

Crear un diccionario que tenga como nombre el valor de una variable creo que no se puede hacer, por supuesto que tampoco cambiar el nombre a uno ya existente, por lo menos hasta donde yo se. por eso te sugiero la siguiente solucion:

(las llamadas a las funciones que aparecen al final del codigo es para probar que funcionan):
Código PHP:
#! /usr/bin/python

# Otra solucion. No se como cambiar el nombre de un diccionario ya creado o crear uno  a partir del valor de una variable
# te sugiero crees un diccionario de personajes con la siguiente definicion dic_personajes={personaje:dic_cualidades}

dic_cualidades = {'fuerza'0'resistencia'0'destreza'0'inteligencia'0'percepcion'0#Diccionario para las cualidades
dic_Karma={}                  # diccionario  que contiene el total del karma de cada personaje
dic_personajes={}            # diccionario de personajes

def  asigna_Cualidades():

 
# Inicializando variables temporales q seran usadas para el control de las preguntas y crear una copia del diccionario de cualidades

    
Si=1No=0dic_CualidadTemp={}
    
dic_CualidadTemp=dic_cualidades.copy()

    for 
cualidad in dic_CualidadTemp.keys():                # Ciclo para asignar valor a cada cualidad
        
faltaValorCualidad=Si                                           # inicializando la falta de valor para cada cualidad
        
while faltaValorCualidad:                                     # preguntar por el valor de la cualidad mientras no este entre 2 y 10 (o sea, mientras falte)
            
try:
                
dic_CualidadTemp[cualidad]=int(input('Entra el valor de %s ' % (cualidad)))
                if 
not (1<dic_CualidadTemp[cualidad]<=10):                                      # Si el valor de la cualidad no esta entre 2 y 10 
                    
raise ValueError                                                                               # genero un error de valor.
                
else:                                                                                                    # si el valor es correcto paso 
                    
print 'Ok!, puntos asignados para %s' % (cualidad)                    # para la otra cualidad
                    
faltaValorCualidad=No                                                                       # ya no falta valor, asi que deja de preguntar!!
            
except  (ValueErrorNameError):                                                             # error en el valor de la cualidad por lo que 
                
print 'El valor de %s debe estar entre 2 y 10' % (cualidad)         # aun falta el valor de la misma y vuelvo a preguntar
           
    
return dic_CualidadTemp                        # retorno un diccionario de cualidades para un personaje x  

def crea_Personaje():
   
strPersonaje=raw_input('nombre personaje:'
   
dic_personajes[strPersonaje]=asigna_Cualidades()
   
# aqui si quieres puedes verificar que el karma sea igual a 40 y si no es asi volver a exigir los valores para las cualidades del mismo personaje
   # eso te lo dejo a ti para que lo implementes.


def muestra_Cualidades():
   for 
personaje in dic_personajes.keys():
       print 
'%s sus cualidades son:' % (personaje), dic_personajes[personaje

def  KarmaUnPersonaje(personaje):
    
total=0
    
for cualidad in dic_personajes[personaje].keys():
        
total += dic_personajes[personaje][cualidad]
    return 
total

def calcula_KarmaTodos
():
    for 
personaje in dic_personajes.keys():
        
dic_Karma[personaje]=KarmaUnPersonaje(personaje)

def muestra_KarmaTodos():
    for 
personaje in dic_Karma.keys():
        print 
'%s tiene %s de karma' % (personajestr(dic_Karma[personaje]))


if 
__name__=='__main__':
    
otroPersonaje=1
    
while otroPersonaje:
        
crea_Personaje() 
        
otroPersonaje=input('otro personaje (Si=1, No=0)?:')
    
    
calcula_KarmaTodos()     
    
muestra_Cualidades()
    
muestra_KarmaTodos() 
Ojala te sirva de algo, un saludo.
  #4 (permalink)  
Antiguo 18/08/2009, 11:59
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: Ayuda - Cambiar nombre de diccionario

Tambien, puedes hacer uso de clases, donde la clase personaje, tenga las propiedades
Fuerza
Destreza
Karma
Etc...

Y hacer sus método para que trabajen con esos valores.
  #5 (permalink)  
Antiguo 18/08/2009, 18:13
AxL456
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Ayuda - Cambiar nombre de diccionario

hola...

No lei completamente el codigo que escribiste solo lo mire por encima pero me imagino que lo que deseas hacer es crear un diccionario que tiene unas cualidades predeterminadas (fuerza, inteligencia, etc) y asignar un valor a cada una de dichas cualidades cumpliendo con lo siguiente:
  • el valor no debe ser mayor que 10
  • el valor no debe ser menor que 2

pero te interesa tambien que dicho diccionario este relacionado con el nombre de "personaje" que va a ingresar el usuario..

como comenta srmagno no creo que se puedas hacer que el usuario te pase el nombre de una variable, pero lo que si puedes es usar diccionarios como valores dentro de un diccionario.

un ejemplo seria lo siguiente:
Código python:
Ver original
  1. base_datos = {'nombre_usuario1': {'inteligencia': 5, 'fuerza': 5, 'destreza': 5, 'percepcion': 5},
  2.              'nombre_usuario2': {'inteligencia': 6, 'fuerza': 6, 'destreza': 6, 'percepcion': 6}}

de esa manera estas creando un diccionario que dentro tiene a todos los nombres de personajes y sus respectivos valores son un diccionario con las "habilidades".


aqui te dejo el codigo para hacerlo(ojo pruebalo porque yo tambien estoy iniciandome en python ):
Código Python:
Ver original
  1. base_datos={}
  2. cualidades = {"fuerza":0, "destreza":0, "inteligencia":0, "percepcion":0}
  3.  
  4. def asignar_valores():
  5.     temp = {}
  6.     for x in cualidades:
  7.         while True:
  8.             try:
  9.                 valor = int(raw_input("%s: " %x))
  10.             except:
  11.                 print "Debe ingresar un valor numerico"
  12.             else:
  13.                 if valor > 10:
  14.                     print "%s debe ser menor o igual que 10" % x
  15.                 elif valor < 2:
  16.                     print "%s debe ser mayor o igual que 2" % x
  17.                 else:
  18.                     temp[x] = valor
  19.                     break
  20.     return temp
  21.  
  22. nombre_personaje = raw_input("ingrese nombre de personaje: ")
  23. base_datos[nombre_personaje]= asignar_valores()
  24.  
  25.  
  26. #print base_datos


solo le faltaria anexar al final la parte donde sumas la cantidad de puntos para ver si es igual, mayor o menor a 40 pero eso ya sabes como agregarlo

PD: como bien dijo razpeitia no uses eval para evaluar lo que ingresa el usuario porque es peligroso, si el usuario ingresa un codigo escrito en python ese codigo se va a ejecutar en el equipo

PD: el codigo esta escrito en python 2.5 por lo que tienes que modificarlo para python 3.1 (raw_input seria input solamente y el print va dentro de parentesis si no me equivoco)
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 19:54.