Python-random

Resulta que no vale sólo con tener un nombre de pila noruego, también necesitamos apellidos… y encima a los del pueblo de al lado, Villarrubia de abajo, les ha dado envidia y también quieren hacerse noruegos…

Necesito algo que genere unos estupendos nombres noruegos sin tener que esforzarme en pensar cuál darle a cada uno, no repetir nombres…

He buscado en Internet y he creado estas listas de posibles nombres y apellidos:

  • nombres_hombre = [“Arne”, “Bjorn”, “Per”, “Knut”, “Terje”, “Erik”, “Kjell”, “Jan”, “Rolf”, “Gunnar”]
  • nombres_mujer = [“Grete”, “Berit”, “Marit”, “Randi”, “Kristin”, “Karin”, “Anja”, “Embla”, “Hilda”, “Silje”]
  • apellidos = [“Erickson”, “Voll”, “Andersen”, “Dahl”, “Landvik”, “Nielsen”, “Christiansen”, “Holt”, “Solberg”, “Skjeggestad”]

Aleatorios01

Y ahora, ¿cómo puedo hacer para generar estos nombres de forma aleatoria? Al hacerlo así, además, puedo decirle a mis vecinos que es el ordenador el que ha decidido y escabullirme de sus continuas quejas. Que si no quiero ser Kjell, que el panadero tiene un nombre más noruego…

¿Cómo puedo hacer un proceso aleatorio? Lo primero saber cómo se dice en inglés. Ya está, lo encontré, se dice random.

Veamos cómo puedo usarlo en Python:

import random, así importaré el generador de procesos aleatorios. Puede ir en cualquier sitio del programa, pero es mejor que lo ponga al principio.

i = random.randint(0,9), esta instrucción guarda en una variable un número aleatorio entre 0 y 9. Puedo cambiar los rangos y que sea entre otros números y puedo cambiar, también, el nombre de la variable. La palabra randint es una función, las funciones ejecutan instrucciones que no están en esa parte del código pero sí accesibles para el programa.

Vale, pues voy a intentar generar un nombre, por ejemplo, para Pepe. Lo primero, tras importar random, será generar un valor aleatorio entre todos los elementos de mi lista. Como mi lista tiene 10 nombres voy a generar un valor entre 0 y 9 (recuerda que el índice de una lista empieza en 0 y no en 1) y lo guardaré con el nombre i:

Ya lo tengo, ahora voy a buscar en mi lista de nombres de hombre noruegos el que se corresponde con el número aleatorio y lo guardaré en la variable nombre_noruego:

Creo que lo he conseguido, voy a imprimirlo y veamos que pasa:

Aleatorios02

¡Fantástico! Mi primer nombre noruego ha resultado ser Rolf, ¡qué emocionante!

Pero un nombre sin apellido no suena respetable, vamos incluir en la variable nombre_noruego un espacio…

… y voy a repetir el proceso anterior para generar otro número aleatorio para la lista de apellidos:

Ahora lo añado a nuestro nombre…

… y lo imprimo para ver qué he conseguido:

Aleatorios03

¡Rolf Landvik! De Oslo de toda la vida. Qué orgulloso me siento de mis progresos.

Ahora tengo que incorporar esto a mi anterior programa, de manera que pueda modificar mi diccionario con los nombres que vaya creando.

Como ya sé utilizar un diccionario sólo debería añadir el nombre generado a la clave “Pepe” de mi diccionario:

¡Genial! Ahora que lo tengo todo claro voy a crear un nombre para María:

A ver qué nombre he creado para María:

Aleatorios04

Hilda Christiansen, ¡qué sofisticado nombre! María estará orgullosa de su identidad noruega.

Nunca tengo suficiente, veamos que me genera Python para Federico:

Aleatorios05

Mmm… Per Erickson, quizá Federico ponga pegas a reducir tanto la extensión de su nombre, pero lo ha decidido el programa, no yo, así que tendrá que aguantarse.

¡Un momento! Al no haber guardado en la lista el nombre generado y volver a usar la variable… he perdido la información. Además, al ser aleatorio, puede que el nombre generado sea el mismo que el que se generó para otro usuario. ¿Cómo puedo asegurarme de que el nombre noruego generado no lo posee ningún vecino?

He descubierto una función que me puede ayudar, un bucle que se va a repetir hasta que el nombre_noruego generado no esté dentro de la lista de vecinos. Cuando genere un nombre que no contenga el diccionario vecinos lo guardaré en la clave Federico. Utilizaré para el ejemplo a Federico.

Todo lo que quiero que esté dentro del while tiene que estar indentado hacia la derecha, si no Python no va a saber qué partes tiene que repetir con el while y que partes no tiene que repetir.

Reconozco que me ha costado lo de .values( ) pero, tras investigar, preguntar y volverme un poco loco, lo he entendido. Un diccionario tiene, por cada uno de sus elementos, dos partes:

  • key: la parte de la izquierda, en mi ejemplo es el nombre en castellano (Pepe, María, Federico…).
  • value: la parte de la derecha, en mi ejemplo es el nombre en noruego (Rolf, Hilda, Per…).

Cuando escribo .values( ) estoy llamando a todos los nombres noruegos y viéndolos como una lista. Lo mismo ocurriría si usase .key( ). ¡Comprendido!

Parece ser que esta función while sólo va a funcionar si previamente he generado ya un nombre_noruego, por lo que si quiero que funcione siempre tendré que generar primero el nombre_noruego y después añadir el while, de forma que sólo lo realice si el nombre está en el diccionario. Si quiero dar un nombre a Federico y es la primera vez que lo hago el código completo será el siguiente:

Todo claro. Ahora bien, ¿y si quiero iniciar un programa entero con un diccionario vacío e ir añadiendo yo los nombres según los voy creando?. Creo saber la respuesta, el código completo, incluido el primer nombre para Federico sería:

Ahora ya puedo ejecutar este código entero e ir creando nombres y añadiéndolos al diccionario, que he declarado con el nombre vecinos y he indicado a Python que es un diccionario diciendo que es igual a dict( ). ¿Y si quiero añadir un segundo nombre? Pepe, por ejemplo:

Voy a ejecutarlo a ver si me da un nombre para Federico y otro para Pepe:

Aleatorios06

¡Y así puedo seguir con todos los nombres que necesite!

Tengo que tener muy en cuenta que al ejecutar mi programa voy a crear nombres que no se guardan en ningún sitio, ¡tendré que apuntarlos! De lo contrario perderé los nombres y al volver a ejecutar mi programa no me creará los mismos nombres… ¡Así son los aleatorios!

Seguro que algún día aprendo a guardar en un archivo los datos que me genere mi programa…