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ón
unico
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 lista
L
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 el
if
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étodo
sample
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, utiliza
sample
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 lista
L
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)