Reto: Ordenar números
Imprimir una lista de 10 números aleatorios sin repetición que varíen en el rango 80 a 99. Volver a imprimir la lista pero ordenada.
Método 1
Definimos la funciónunico
que tiene dos argumentos. La función, dado el número x
y la lista L
, detecta si x
es único o esta repetido. Si el número x
no está en la lista entonces retorna True
, y si el número se encuentra ya en la lista entonces devuelve False
.El bucle
while
nos proporciona los 10 números aleatorios sin repetición que ha de llegar a tener la lista. En este caso el bucle ha de ser del tipo while, no valdría un for
, ya que no conocemos el número de ciclos que serán necesarios, puesto que si no existen repeticiones serán 10 ciclos pero si las hay el número aumenta. Por cada repetición encontrada se ha de generar un nuevo x
aleatorio. Los x
únicos generados se anexionan a la lista con append
.Finalmente se imprime la lista
L
y se ordena con sort
.import random
def unico(x,L):
esUnico=True
for i in range(len(L)):
if x==L[i]:
esUnico=False
break
return esUnico
L=[]
j=0
while j<10:
x=random.randint(80,99)
if unico(x,L):
L.append(x)
j+=1
print(L)
L.sort()
print(L)
Método 2
Inicializamos la listaL
con su primer valor, el de la posición cero. Esto se hace fuera del bucle while
ya que el primer x
estamos seguros de que no se repite respecto a los anteriores, ya que es el primero. Luego nos metemos en un bucle while
que genera los demás x
aleatorios que de momento son candidatos, hasta que no se compruebe que no están repetidos entre los elementos que ya se encuentran en la lista. Para conseguir establecer si el número candidato se ha de anexionar a la lista o no se hace usando un bucle for
que contiene un condicional if
. La clave está en el else
que no pertenece al if
sino al for
.Finalmente imprimimos la lista
L
y la ordenamos con sorted
.import random
L=[random.randint(80, 99)] #este es L[0]
i=1
while i<10:
x=random.randint(80,99)
for j in range(0, len(L)):
if L[j]==x:
break
else:
L.append(x)
i+=1
print(L)
print(sorted(L))
Método 3
Esta es una variante del método anterior que mejora el código ya que usa en elif
la instrucción in
, o mejor dicho, not in
, para detectar si el nuevo número aleatorio se encuentra entre los que ya se han añadido a la lista L
.import random
L=[random.randint(80, 99)] #este es L[0]
i=1
while i<10:
x=random.randint(80,99)
if x not in L:
L.append(x)
i+=1
print(L)
print(sorted(L))
Método 4
Importamos únicamente el métodosample
de la librería random
que permite crear una lista eligiendo aleatoriamente 10 valores de un rango de números creado con range
que varía entre 80 y 100 (excluido el 100).Con
sorted
ordenamos la lista . Si deseamos que la ordenación sea inversa tendremos que indicarlo poniendo print(sorted(L,reverse=True))
.from random import sample
L=sample(range(80,100),10)
print(L)
print(sorted(L))
Método 5
Este método, al igual que el anterior, utilizasample
para elegir una muestra aleatoria entre los posibles valores que generamos utilizando List Comprehension.Faltaría ordenar la lista, pero hemos preferido dejar el código así para que se vea que en dos líneas se puede llegar a obtener la lista de aleatorios sin repetición.
from random import sample
print(sample([x for x in range(80,100)],10))
Método 6
Creamos la listaL
usando list
y range
. Esta lista contendrá todos los números enteros consecutivos entre 80 y 99. La instrucción random.shuffle(L)
baraja aleatoriamente la lista L
. Creamos la lista L10
que contendrá los 10 primeros elementos de la lista L
. Imprimimos la lista L10
. Ordenamos la lista L10
en sentido inverso usando sort
. Si la queremos ordenar en sentido creciente simplemente dejaremos vacío lo que va entre sus paréntesis. Sería L10.sort()
.import random
L=list(range(80,100))
random.shuffle(L) #baraja la lista
L10=L[:10] #crea otra lista con los 10 primeros elementos
print(L10)
L10.sort(reverse=True) #ordena la lista L10
print(L10)
El problema resuelto verdaderamente sería sin usar el método sort.
ResponderEliminarMuchisimas Gracias! Me ayudo bastante. Sigue así, saludos!
ResponderEliminarExcelente aporte, pero si quisiera que aparecieran mas listados de numeros en el for agrego la variable o tendria que ser en la impresion?
ResponderEliminarimport random
ResponderEliminarnums = []
for i in range(11):
num = random.randint(80, 99)
while num in nums:
num = random.randint(80, 99)
nums.append(num)
print(nums)
print(sorted(nums))
Asi lo hice yo despues de un ratico comiendome el coco
El comentario me quita la indetacion
EliminarLe entendi la logica, pero lo probe e imprime una matriz vacía, le modifique un poco a tu código y me quedo asi:
Eliminarimport random
nums = [random.randint(80,100)]
for i in range(9):
(1Tab)num = random.randint(80, 100)
(1Tab)while num in nums:
(2Tab)num = random.randint(80, 100)
(1Tab)nums.append(num)
print(nums)
print(sorted(nums))
Le pongo 1Tab o 2Tab para indicar las tabulaciones correspondientes