0

Estoy trabajando en un menú donde se tiene que cargar un diccionario como función, pero como se trabaja con otras funciones al momento de llamarlas se pierde la información y no la guarda. Es un proyecto final, me encantaría que me explicaran porque no funciona mas que resolver el problema.

Los problemas que tengo:

  • El contador me lo da como error.
  • Debería cargarse el diccionario una sola vez y no lo hace

El archivo que se usa:

1,casa,2,house,3,maison

2,table,3,table,1,mesa

3,fille,2,daughter,1,hija

2,she,1,ella,3,elle

El código:

from collections import defaultdict
import csv
import time

def cargar ():
  key_dic = {"1": "español", "2": "inglés", "3":"frances"}
  dic = defaultdict(list)
  with open("/content/diccionario.dat") as file:
      for line in file.readlines():
          for palabra in line.strip().split(","):
              if palabra.isnumeric():
                  key = key_dic[palabra]
              else:
                  dic[key].append(palabra)
  print(dic)

contador=0
def no_carga():
  print("No se ha activado el diccionario")  


def es_in ():
  cargar()
  print ("-----------------------------------------")
  busqueda = input("Introduzca la palabra que desea buscar \n")

  if busqueda in diccionario["español"]:
    print ("-----------------------------------------")
    indice=diccionario["español"].index(busqueda)
    print ("Su traduccion al idioma Ingles es: ",diccionario["ingles"][indice])
    print ("-----------------------------------------")
    print ("")

  if busqueda not in diccionario["español"]:
    print("NO SE ENCUENTRA, INTENTA AGAIN")


def in_fr ():
  diccionario ={"español":["casa","mesa","hija","ella"],"ingles":["house","table","daughter","she"],"frances":["maison","table","fille","elle"]}
  print ("-----------------------------------------")
  busqueda = input("Introduzca la palabra que desea buscar \n")

  if busqueda in diccionario["ingles"]:
    indice=diccionario["ingles"].index(busqueda)
    print ("-----------------------------------------")
    print ("Su traduccion al idioma Frances es: ",diccionario["frances"][indice])
    print ("-----------------------------------------")
    print ("")


  if busqueda not in diccionario["ingles"]:
    print("NO SE ENCUENTRA, INTENTA AGAIN")


def menu ():
  
  print ("************************************")
  print("Bienvenido al Diccionario de Ninos")
  print ("************************************")
  print ("1. Cargar Diccionario \n",
          "2. Español – Inglés \n",
          "3. Inglés – Francés \n",
          "4. Buscar Palabras \n",
          "5. Salir")
 
  eleccion = int(input("Presionar opcion de ejecucion: "))
  if eleccion == 1:
    contador=1
    cargar()
    

  elif eleccion == 2:
   if contador==1:
      es_in ()
   else:
    no_carga()

    
  elif eleccion == 3:
    in_fr ()
  

  elif eleccion == 4:
    buscar ()

  elif eleccion == 5:
    exit()
  
  elif eleccion >= 6:
    print("Opcion no valida")

  elif eleccion < 1:
    print("Opcion no valida")

while True:
  try:
    menu()
    time.sleep(2)
  except ValueError:
    print("Opcion no valida")
jgl605
  • 5
  • 2

2 Answers2

0

¿Como usar datos usados en def que se mantengan a lo largo del codigo?

Para eso existen las variables globales, que por cierto es una mala práctica.

bar = "alguna"

def foo():
    global bar

    bar += "cosa"

foo()

De no realizar la declaración global, se obtendría un error.

UnboundLocalError: local variable 'bar' referenced before assignment

Como dije, esto es una mala práctica (ver el enlace de arriba). Entonces, ¿Cuál es la manera "buena"?

Puedes usar la declaración return, que le asigna un valor a la evaluación de la función. El valor predeterminado de una función es None.

def foo():
    var = "alguna"

    return var

def bar(word):
    print(word, "cosa")

word = foo()
bar(word)

La función retorna foo() un valor y se usa como parámetro de bar(). Por lo tanto, el valor de var persiste en bar().

alguna cosa

Otra opción es implementar llamadas dentro de una función a otra función con argumentos.

def foo():
    var = "alguna cosa"

    bar(var)

def bar(word):
    print(word)

foo()

Se llama a foo(), debido a que esta llama a bar(). El argumento que se usa se toma en cuenta del scope de bar().

Espero haberte ayudado.

0

Te estás complicando mucho con la parte de las opciones. Y también complicas más de la cuenta hacer un diccionario de datos desordenado. Puedes trabajar el diccionario en una hoja de cálculo externa con las columnas definidas: Español - Inglés - Francés

dicionario.csv

casa,house,maison
mesa,table,table
hija,daughter,fille
ella,she,elle

Cuando empieza la ejecución del script, se llama a una función load_dictionary() que lee el archivo csv y retorna un diccionario con cada key que corresponde al idioma y value es una lista con cada palabra de ese idioma.

{'es' : ['casa', 'mesa', ...], 
'en' : ['house', 'table',...], 
...}

En la función menu() hay otro diccionario con el formato para cada línea:

"numero_opcion" : ["texto de opcion", "idioma1", "idioma2"]

Con esos datos es suficiente para construir el menú y comandar el funcionamiento del programa.

import csv

def load_dictionary():
    dictionary = {'es':[], 'en':[], 'fr':[]}
    csv_file = open('stack040.csv','r')
    for row in csv.reader(csv_file, delimiter=','):
        dictionary['es'].append(row[0])
        dictionary['en'].append(row[1])
        dictionary['fr'].append(row[2])
    csv_file.close()
    return dictionary

def translate(dictionary, opt):
    print(f"\nTraductor {opt[0]}")
    dc1 = dictionary[opt[1]]
    dc2 = dictionary[opt[2]]
    word = input("Palabra a buscar: ").lower()
    if(word in dc1):
        idx = dc1.index(word)
        transl = dc2[idx]
        print("La traduccion es: ", transl)
    else:
        print("La palabra no ha sido incluida en el diccionario")

def menu():
    print()
    print("************************************")
    print("Bienvenido al Diccionario de Ninos")
    print("************************************")
    prmenu = {'1' : ["Español - Ingles", "es", "en"], 
    '2' : ["Español - Francés", "es", "fr"], 
    '3' : ["Inglés - Francés", "en", "fr"], 
    '4' : ["Salir", False]}
    for option in prmenu:
        print(f"{option} - {prmenu[option][0]}")
    while True:
        eleccion = input("Seleccione una opcion: ")
        if eleccion in prmenu:
            break
    return prmenu[eleccion]

# ############################
dictionary = load_dictionary()
while True:
    opt = menu()
    if not opt[1]:
        break
    translate(dictionary, opt)
aeportugal
  • 7,106
  • 2
  • 9
  • 21
  • Yo se que el formato es feo e ineficiente, pero tengo que trabajar con ese, es obligatorio, yo tenia todo el proyecto desarrollado con uno similar al que muestras pero me lo rechazaron – jgl605 Aug 05 '20 at 21:12
  • Listo, entendido @jgl605 Igual lo dejaré como referencia. – aeportugal Aug 05 '20 at 21:36