Need to convert this For loop to while - python

I am trying to convert for loop to while loop in python and I am not very sure how to do it. Need some help here, thanks! This is what I am working with :
#FOR
#aplicacion que imprima tablas de multiplicar desde la tabla que yo quiera hasta la tabla que yo quiera elijiendo desde que multiplicacion mostrar hasta que multiplicacion mostar
desde=int(input("desde tabla quiere saber...?"))
hasta=int(input("hasta que tabla quiere saber...?"))
comenzando=int(input("desde que multiplicacion quiere ver?...?"))
multi=int(input("hasta que multiplicacion quiere ver?...?"))
for i in range(desde,hasta+1):
for a in range(comenzando,multi+1):
rta= i*a

This is source
desde=int(input("desde tabla quiere saber...?"))
hasta=int(input("hasta que tabla quiere saber...?"))
comenzando=int(input("desde que multiplicacion quiere ver?...?"))
multi=int(input("hasta que multiplicacion quiere ver?...?"))
x = desde
while x <= hasta:
a = comenzando
while a <= multi:
rta = x*a
a += 1
x += 1
print(rta)

for is perfect for the loops you have, because you know the start and end and there are a fixed number of loops. while is more appropriate for loops where they can run varying number of loops, e.g. prompting repeatedly until a valid email address is entered.
i = desde
while i <= hasta:
a = comenzando
while a <= multi:
rta = i*a
a += 1
i += 1
This can be done as one while loop, but there would be calculations to work out the a and i values, using divide and modulo/remainder.

Related

Make a Menu using Match Case Python

I have created another MENU in a different exercise using IF in this time I did it with MATCH CASE and I have a doubt, is it possible to print the menu again and if it is possible how I would do it, I think in an if but it is the first time that I use these sentences.
this is my code:
...Later i need to work with dictionaries so with this method can do it?, or I need to use IF to create the menu from the beginning?
menu = """
1. Datos del pasajero.
2. Agrega una ciudad.
3. Ingresa DNI para ver las ciudades que coinciden con el dato.
4. Escribe una ciudad para ver el # de pasajeros.
5. Ingresa DNI para ver los paises que coinciden con el dato.
6. Ingresa un pais y mostrar el total de personas que viajan.
7. Terminar el programa
"""
viajeros = {}
paises = {}
print(menu)
dato_leido = int(input('Escriba una opcion para comenzar con el programa: '))
match dato_leido:
case 1:
print('Escriba los datos del pasajero: ')
case 2:
print('Agrega una ciudad a la lista:')
case 3:
print('Ingresa el DNI del pasajero para ver a que ciudad ha viajado: ')
case 4:
print('Ingrese una ciudad para ver el numero de pasajeros: ')
case 5:
print('Ingresa el DNI de una persona para ver a que paises viaja: ')
case 6:
print('Ingresa un pais y mostrar el total de personas que viajan: ')
case _:
print('Saliendo del programa en 3, 2, 1(FIN).')

Python function return 'None' list

I have a function that removes duplicates from a list, and if removed, fills again those blanks with another entry of another list with all possible entries.
Right now, I have a function which does this work, but I don`t know why, at time to store that complete list without duplicates in another list when I call it, it appears as "none". But it works properly.
This is the function:
def elimina_Rep(dondeborrar, cantidadNecesaria, fichcompleto):
sinRep = [] # Donde almacenaremos las NO repetidas
sinRep_AUX = [] # Para borrar en la borrada, (varios ciclos de borrado)
for elem in dondeborrar: # Primera busqueda de elementos duplicados
if(elem not in sinRep): sinRep.append(elem) # Obtenemos una lista sin repeticiones
if sinRep == dondeborrar : pass # Comprobamos que haya diferencia de cantidad entre ambas
else:
while(sinRep != sinRep_AUX):
dif = (cantidadNecesaria - len(sinRep)) # Obtenemos cuantos elementos hemos borrado
for i in range(0,dif): # Generamos tantas nuevas entradas como las que hemos borrado
sinRep.append(random.choice(fichcompleto)) # Obtenemos una nueva lista completa (pero con posibles repeticiones)
for j in sinRep: # Comprobamos que no haya repeticiones de la primera busqueda
if(j not in sinRep_AUX): # Segunda busqueda de elementos duplicados
sinRep_AUX.append(j) # Obtenemos una lista sin repeticiones sinRep_AUX desde la primera sin rep
if(sinRep == sinRep_AUX):
return sinRep_AUX
else:
sinRep = sinRep_AUX
sinRep_AUX = []
If I print at the end of the function the content of sinrep_AUX (final correct list) all is OK, the problem appears in the calling at time to store it.
def gen_Preg(asignatura, porcentaje):
preguntas = [] # Creamos una lista vacia para alamcenar las preguntas
porc = int((porcentaje/100)*totalpreguntas) # Obtenemos cuantas preguntas necesitamos de esa asignatura por %
# Bucle for para obtener y escribir la 1a vez (con posibles duplicaciones)
with open(asignatura, 'r') as aPreg:
fichero = aPreg.read().strip().splitlines() # Obtenemos el fichero sin posibles espacios
for i in range(0,porc):
preguntas.append(random.choice(fichero))
random.shuffle(preguntas) # Mezclamos las preguntas generadas
preg_filt = elimina_Rep(preguntas, porc, fichero) # Tenemos un archivo con preguntas sin repeticiones
print(preg_filt)
Here, the first line shows the content of print sinRep_AUX from function elimina_Rep, and the last line, shows the content of preg_filt, that I suppose that is the list which store the returned list of the function when I call it
['Como te llamas?', 'Donde vives?', 'Como tomas apuntes?']
None
I've tried to change the return line from return sinRep_AUX to return elimina_Rep(dondeborrar, cantidadNecesaria, fichcompleto) as I saw in other posts, but it doesn't work
You only return something when if sinRep == dondeborrar fails and then during the loop if(sinRep == sinRep_AUX) succeeds.
You can solve these problems by moving the return statement to the end of the function.
def elimina_Rep(dondeborrar, cantidadNecesaria, fichcompleto):
sinRep = [] # Donde almacenaremos las NO repetidas
sinRep_AUX = [] # Para borrar en la borrada, (varios ciclos de borrado)
for elem in dondeborrar: # Primera busqueda de elementos duplicados
if(elem not in sinRep): sinRep.append(elem) # Obtenemos una lista sin repeticiones
if sinRep == dondeborrar : pass # Comprobamos que haya diferencia de cantidad entre ambas
else:
while(sinRep != sinRep_AUX):
dif = (cantidadNecesaria - len(sinRep)) # Obtenemos cuantos elementos hemos borrado
for i in range(0,dif): # Generamos tantas nuevas entradas como las que hemos borrado
sinRep.append(random.choice(fichcompleto)) # Obtenemos una nueva lista completa (pero con posibles repeticiones)
for j in sinRep: # Comprobamos que no haya repeticiones de la primera busqueda
if(j not in sinRep_AUX): # Segunda busqueda de elementos duplicados
sinRep_AUX.append(j) # Obtenemos una lista sin repeticiones sinRep_AUX desde la primera sin rep
if(sinRep == sinRep_AUX):
break
else:
sinRep = sinRep_AUX
sinRep_AUX = []
return sinRep_AUX

How to insert a new line after each element in a list? Python

I tried to append some elements to a new list, and I wanted to separate each one by a new line. I tried this:
for i in list_rents:
result.append("{}: {}\n".format(i, 'Caro' if i > avg else 'Precio razonable'))
print("El precio promedio de la lista dada es {}, por lo que estas son las comparaciones independientes:\n {}".format(avg, result))
The last part worked as I expected, but the first one did not, why does that happen, and how can I solve it?
Here's the output:
El precio promedio de la lista dada es 24.166666666666668, por lo que estas son las comparaciones independientes:
['21.0: Precio razonable\n', '12.0: Precio razonable\n', '32.0: Caro\n', '23.0: Precio razonable\n', '43.0: Caro\n', '14.0: Precio razonable\n']
And here is the full code:
result = []
ans = input('Quieres agregar un elemento a la lista de precios de rentas? (S) Si, (N) No.')
while ans == 'S':
new_value = float(input('Ingrese el valor del nuevo elemento'))
if new_value > 0:
list_rents.append(new_value)
else:
print('Programa terminado, ese es un valor inaceptable')
sys.exit()
ans = input('Quieres agregar un elemento a la lista de precios de rentas? (S) Si, (N) No.')
avg = sum(list_rents)/len(list_rents)
for i in list_rents:
result.append("{}: {}\n".format(i, 'Caro' if i > avg else 'Precio razonable'))
print("El precio promedio de la lista dada es {}, por lo que estas son las comparaciones independientes:\n {}".format(avg, result))
If you want to turn a list of strings li into a single string, joined by newlines, you should use "\n".join(li), instead of adding a newline to each string individually (because you'll still have a list then).

Who can i do this? object too deep for desired array

who are yours?...sorry for my english translate but im from Spain, and my english is very bad, sorry.
Im trying to make a program for my class of Computational Physical Programmation. I need to study the position and the velocity of 2-phase rocket, changing the % of gas of the first phase(it, obviously, change the % of 2 phase gas,Masa1= mass of 1phase, Masa 2= mass of 2phase). Changing the gas, change the time of fly. I wish to put all data whit odeint like this:
from numpy import * #importamos todo lo que
from scipy.integrate import odeint #podamos necesitar a lo largo
import matplotlib.pyplot as plt #del programa
#funciones
def funder (M,t,u,D,m0): #funcion para calcular luego
'''funcion derivada''' #la integral de la funcion
y, v=M[0],M[1]
return array([v,u*D/(m0-(D*t))])
#constantes
ni=100 #numero de intervalos
#cohete de una fase
#Datos propuestos en el enunciado para una primera prueba
D=13840. #Kg/s cantidad de combustible que se quema por segundo
m0=2.85e6 #Kg masa total inicial
u=2.46 #km/s velocidad de salida de los gases
r=0.05 #proporcion de la masa recipiente
mu=0.47*m0 #masa util
mc=(m0-mu)/(1+r) #masa combustible
t0=mc/D #tiempo que tarda en quemar el cobustible en una etapa
#condiciones iniciales
y0, v0 =0, 0 #posicion y velocidades iniciales igual
ListaPorce=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9] #lista de #porcentajes,luego se convertira
#en un array
Intervalos=[] #lista con los #intervalos de tiempo de los
#distintos porcentajes de combustible
for i in ListaPorce: #para los i en ListaPorce, haz:
Combustible=mc*i #multiplicara los indices por #el combustible
#asi sabemos que cantidad de #combustible para cada porcentaje
tempo=linspace(0,(Combustible/D),ni) #tempo es el array de tiempos #para cada porcentaje de combustible
Intervalos.append(tempo) #aƱade tempo a la lista #Intervalos, que luego sera un array
Duracion=array(Intervalos) #convertimos la lista #Intervalos al array Duracion
Porcentaje=array(ListaPorce) #convertimos la lista #ListaPorce al array Porcentaje
Usado=mc*Porcentaje
masa1=mu+(1+r)*Usado #masa de la fase 1
masa1.shape=(masa1.size,1)
masa2=mu+(1+r)*(mc-Usado) #masa de la fase 2
Comparacion01=odeint(funder,array([y0,v0]),Duracion, args=(u,D,masa1))
print Comparacion01
But when i make run, the program say me:
Traceback (most recent call last):
File "Trabajo IFC.py", line 278, in <module>
Comparacion01=odeint(funder,array([y0,v0]),Duracion, args=(u,D,masa1))
File "/usr/lib/python2.7/dist-packages/scipy/integrate/odepack.py", line 144, in odeint
ixpr, mxstep, mxhnil, mxordn, mxords)
ValueError: object too deep for desired array
The error is for use a non 1D array for odeint, true?. Who i can do that?
i wish to have a "mega-array"(Comparacion01) like [%,times,position,velocity]
Who i can do that? need to change the funcion "funder"
thanks a lot for all users. i will continue trying...

Infinite Loop i don't know why ( DichotomySearch )

so i'm working on a program that search a term by dichotomy. It makes an infinite loop and i don't know why but i know where ( in the elif/else ). So here is my code :
def RechercheDichotomique(liste,x):# Algo pour recherche dichotomique
DebutListe=0
FinListe=len(liste)
while (FinListe-DebutListe)>1:# On ne cherche que si la liste a au moins un terme dedans
ElementCentral=int(len(liste[DebutListe:FinListe])/2)# On prend l'element central de la liste
liste[DebutListe:FinListe]
if liste[ElementCentral]==x:# Si l'element central est x correspondent on renvoie True
return (True)
elif liste[ElementCentral]<x:# Si l'element central est inferieur a x alors on prend la moitie superieure
DebutListe=ElementCentral
FinListe=len(liste)
else:# Sinon on prend la partie inferieure de la liste
DebutListe=0
FinListe=int((FinListe)/2)
if FinListe-DebutListe==1 and liste[ElementCentral]==x:# On verifie qu'il ne reste qu'un terme dans la liste et que le seul qui reste est bien x
return (True)
I know there is plenty ways of doing it more easily but i need to keep the List untouched.
Thanks you already guys!
You have a line in your code:
liste[DebutListe:FinListe]
that doesn't do anything, as the result is not stored. You'll need to reassign this if you want it to work:
liste = liste[DebutListe:FinListe]
Here's an implementation of binary search that more strictly adheres to Python's style guide:
def binary_search(collection, x):
while collection:
center = len(collection) / 2
if collection[center] == x:
return True
elif collection[center] < x:
collection = collection[center + 1:]
else:
collection = collection[:center]
else:
return False

Categories

Resources