Básicamente se trata de una guía telefónica, la cual tiene ser construida usando diccionarios esa es la restricción, en la cual se puede realizar una búsqueda por el nombre de la persona y luego imprimir ese nombre con su respectivo número.
PERO TODO INDICA QUE LE FALTA UNA MEJOR OPTIMIZACIÓN.
Gracias por sus respuestas.
def phone_book():
n = int(input())
phone_book = {} # dictionary
for i in range(n):
string = input().split()
phone_book.update({string[0]: int(string[1])})
return phone_book
# processing
def query(phone_book):
i = 0
while i < len(phone_book):
_query = input()
if _query in phone_book:
print(f"{_query}={phone_book[_query]}")
else:
print("Not found")
i += 1
query(phone_book())
[/
[code=python]def query(phone_book):
for i in range(len(phone_book)):
_query = input()
no entiendo la cantidad de ciclos alli
el primero... estás haciendo un query, entonces para que repetirlo tanto como numeros de telefonos haya? solo lo necesitas hacer una vez y listo...
luego aqui
if _query in phone_book:
for key in phone_book:
if _query == key:
print(f"{key}={phone_book[key]}")
else:
print("Not found")
no entiendo que hace el ciclo, es decir si query está en el phone_book, tan simple como que lo puedes acceder, no tienes que recorrer el diccionario, ese es el punto de los mismos...
con correcciones quedaría según mi estilo
def phone_book():
n = int(input("indica cuantos numeros vas a ingresar: ")) # 1*
phone_book = {}
for i in range(n):
buff = input("ingresa el nombre un espacio y el numero: ") # 2*
nombre, numero = buff.split(" ", 1) # 3*
phone_book[nombre] = numero # 4*
return phone_book
def query(phone_book):
_query = input("ingresa el nombre a buscar: ")
if _query in phone_book:
print(f"{_query}={phone_book[_query]}") # 5*
else:
print("Not found")
query(phone_book())
1* importante saber que pides
2* cuidado con usar palabras reservadas, no te vaya a traer errores mas adelante
3* aunque parezca redundante ayuda a dejar claro y visible lo que pasa
4* ya que no estás fusionando 2 diccionarios si no agregando un solo elemento, no es necesario usar update con un diccionario temporal
5* cuidado con la impresion de formato, esto es apropiado para debug pero puede traerte problemas en un sistema de produccion
[/code]
Los bucles while son más rápidos que los for en prácticamente todos los lengujes (en javascript no porque hacen cosas raras con los engine)
while --n:
Al llegar a 0 para solo porque equivale a false, no tienes que declarar ni iterar i ni comprobar el condicional de i con n.
Si buscas performance usa asyncio, multithread, controla instancias programáticamente o algo así. Testea y compara.
Cita de: @?0!,5^34 en 14 Enero 2020, 08:09 AM
Los bucles while son más rápidos que los for en prácticamente todos los lengujes (en javascript no porque hacen cosas raras con los engine)
while --n:
Al llegar a 0 para solo porque equivale a false, no tienes que declarar ni iterar i ni comprobar el condicional de i con n.
Si buscas performance usa asyncio, multithread, controla instancias programáticamente o algo así. Testea y compara.
insisto... los while a nivel de compilador son básicamente lo mismo, incluso si tuvieran 3 o 4 instrucciones extra es irrelevante incluso ante una suma...
por otro lado, mira el tema y el código para tirar de cosas como esas librerias... es decir, virtualmente no creo que sea si quiera posible aplicarlas aqui... estamos hablando de un problema de algoritmia, no de limitacion de sistema
por otro lado en python es preferible que uses el for para navegar los array ya que en el interprete se hace a bajo nivel en comparacion con tu accesandolo por ciclo
Obtuve un buen resultado usando el bucle while en la busqueda.
Pero parece que aun le falta más optimización
insisto... ni si quiera se para que haces una busqueda... :s es decir, tienes que obligatoriamente hacer una busqueda con un ciclo? porque python la hace por ti...
Si tengo que usar un ciclo ya que la cantidad de busquedas es igual a la longitud del diccionario.
Es una práctica de HackerRank, con el ciclo while logre componer un error de compilación ahora obtengo un Runtime Error y busque en san google y encontre que es por falta de optimización pero no se que más hacerle.
estás seguro que estás trabajando en python? python no compila, asi que no puedes tener errores de compilacion...
y runtime error es un error generico que no recuerdo que python muestre, python da errores muy detallados tipo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
que interprete de pyhton usas?
como dice exactamente el problema que resuelves?
¿Que está?
disculpa, estaba escribiendo y se mandó el mensaje... aqui completo
Cita de: engel lex en 15 Enero 2020, 01:39 AM
estás seguro que estás trabajando en python? python no compila, asi que no puedes tener errores de compilacion...
y runtime error es un error generico que no recuerdo que python muestre, python da errores muy detallados tipo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
que interprete de pyhton usas?
como dice exactamente el problema que resuelves?
Perdón no me especifique bien ese ejercicio lo estoy haciendo en la página de HackerRank y ese error lo tira el interprete dcha página.
El RuntimeError se da cuando al diccionario se le añade un total de 100000 datos y se luego se hace una busqueda de igual magnitud.El script que hice le toma mucho tiempo en realizar la busqueda y no pasa la prueba.
para ver tu codigo y el enunciado exacto del problema
Task
Given n names and phone numbers, assemble a phone book that maps friends' names to their respective phone numbers. You will then be given an unknown number of names to query your phone book for. For each name queried, print the associated entry from your phone book on a new line in the form name=phoneNumber; if an entry for name is not found, print Not found instead.
Note: Your phone book should be a Dictionary/Map/HashMap data structure.
Aqui ya inicialice algunas variables pero aun sigue el error
def phone_book():
n = int(input())
phone_book = {} # dictionary
for i in range(n):
string = input().split()
phone_book.update({string[0]: int(string[1])})
return phone_book
# processing
def query(phone_book):
i = 0
_query = ""
lenght = len(phone_book)
for i in range(lenght):
_query = input()
if _query in phone_book:
print("{0}={1}".format(_query, phone_book[_query]))
else:
print("Not found")
query(phone_book())
estoy viendo a pagina... y no, ignora el runtime error... runtime error simplemente significa "error en tiempo de ejecucion" es decir que tu error no está intrinseco en tu codigo, sino en tu logica, y ese error en python de nada sirve
bajo ese error debe estar la salida exacta del error
ejemplo
(https://i.imgur.com/QFUDXRl.png)
A mi simplemente me sale
Compiler Message:
RuntimeError
Input (stdin)
10000
Lista de todos los datos que se ingresaron
Expected output
Lista de todos los datos buscados
no creo que sea por exceso de tiempo, ya que acabo de intentar algo que tarde mucho y da
(https://i.imgur.com/zTv1QZs.png)
hay algo fallando en otro lugar... el resto de tus test cases son exitosos?
Asi es pero no entiendo porque al primer intento salen todos los casos bien y luego se queda cargando y falla el primer caso