AnteriorPosterior

5 - Matrices, listas y cadenas de texto

Por: Nacho Cabanes
Actualizado: 18-04-2019 09:52
Tiempo de lectura estimado: 15 min.

 

Python

5 - Matrices, listas y cadenas de texto

5.1. Matrices y listas

Cuando necesitamos manejar muchos datos, generalmente hay soluciones más efectivas que tener muchas variables. Por ejemplo, si hay que guardar 100 números, suele ser más eficiente almacenar esos 100 datos "juntos", formando una "matriz", en vez de usar 100 variables distintas.

La palabra "matriz" es una traducción del inglés "array". Algunos autores lo traducen alternativamente como tabla, vector o incluso "arreglo".

Normalmente, en una matriz podremos acceder individualmente a cada uno de sus elementos usando corchetes: el primer dato sería algo como "datos[0]", y el último de 10 elementos sería "datos[9]".

Vamos a ver un ejemplo que prepare un array con 6 elementos, nos pida 6 datos y luego los muestre en orden contrario al que se han introducido:

datos = [0,0,0,0,0,0]
for i in range(1,7):
    datos[i-1] = int( input( "Dime el dato numero {}: ".format(i) ))
print ("Los datos al reves son: ")
for i in range(6,0,-1):
    print ( datos[i-1] )

En Python, los arrays pueden ir aumentando de tamaño (comparado con otros lenguajes de programación, en este sentido se parecen más a lo que en muchos lenguajes de programación se conoce como "listas"). Así, podemos partir de un array vacío e ir añadiendo elementos con ".append":

datos = []
for i in range(1,7):
    nuevoDato = int( input( "Dime el dato numero {}: ".format(i) ))
    datos.append(nuevoDato)
print ("Los datos al reves son: ")
for i in range(6,0,-1):
    print ( datos[i-1] )

Nota: No podemos crear el array vacío con "datos = []" y luego dar valor a un elemento con "datos[0]=5", porque obtendríamos un mensaje de error que nos avisa de que nos hemos salido del rango de los datos. Deberemos reservar todas las posiciones (como en el primer ejemplo) o bien usar ".append" (como en el segundo).

También podemos saber la cantidad de datos con "len(datos)", eliminar un elemento con ".remove", insertar en una cierta posición con ".insert", o añadir toda una nueva lista de datos con "+", como en este ejemplo:

datos = [5,6,7,8,9]
for i in range(0,5):
    print ( datos[i] , end=" " )
print()
 
datos.remove(6)
for i in range(0, len(datos)):
    print ( datos[i] , end=" " )
print()
 
datos[0]=-2
for i in range(0,len(datos)):
    print ( datos[i] , end=" " )
print()
 
datos.insert(1,23)
for i in range(0,len(datos)):
    print ( datos[i] , end=" " )
print()
 
datos = datos + [31,32,33]
for i in range(0,len(datos)):
    print ( datos[i] , end=" " )
print()

Cuyo resultado sería

5 6 7 8 9 
5 7 8 9 
-2 7 8 9 
-2 23 7 8 9 
-2 23 7 8 9 31 32 33

Si un array va a contener muchos más datos, puede resultar incómodo eso de dar los valores iniciales uno por uno, y quizá no podamos emplear ".append" si los valores no los vamos a recibir exactamente en orden. En ese caso, se puede inicializar el array usando una orden "for" dentro de los corchetes, así:

datos = [0 for x in range(20)]
for i in range(0,len(datos)):
    datos[i] = int( input( "Dime el dato numero {}: ".format(i+1) ))
print ("Los datos al reves son: ")
for i in range(len(datos),0,-1):
    print ( datos[i-1] )

Una forma más avanzada de crear un (falso) array vacío, para luego irlo rellenando, es usar unas llaves vacías, como en "datos = { }", aunque esto tiene un significado ligeramente distinto (estaríamos creando un "diccionario", como veremos más adelante):

datos = { }
for i in range(1,7):
    datos[i-1] = int( input( "Dime el dato numero {}: ".format(i) ))
print ("Los datos al reves son: ")
for i in range(6,0,-1):
    print ( datos[i-1] )

También tenemos la posibilidad de hacer ciertas operaciones habituales de forma automática: ver si un elemento aparece o no dentro de nuestros datos, contar la cantidad de veces que aparece, mostrar el mínimo, el máximo, ordenar los datos... Nosotros no las haremos de forma automática, sino artesanal, como parte de los ejercicios, para tomar soltura con los pasos que normalmente requieren esas operaciones, y que nuestro conocimiento sea extrapolable a otros lenguajes de programación que no nos den tanto trabajo hecho como Python.

Ejercicios propuestos:

  • 5.1.1. Crea un programa que pida al usuario 10 números enteros y luego muestre los que eran pares, todos ellos en la misma línea separados por un espacio en blanco.

  • 5.1.2. Crea un programa que pida al usuario 10 números enteros, los guarde en un array y luego le pregunte de forma repetitiva qué número quiere buscar. Le responderá si dicho número estaba o no entre los datos que se habían introducido inicialmente. Dejará de repetirse cuando se introduzca el número 0.

  • 5.1.3. Crea una variante del programa 5.2 que no sólo diga si el número estaba o no, sino que informe de cuántas veces se ha encontrado.

  • 5.1.4. Crea un programa que pida al usuario las componentes de dos vectores de 3 elementos. Después debe mostrar el módulo de cada uno de los vectores, así como su producto escalar.

  • 5.1.5. Crea un programa que pida al usuario 5 números reales, los guarde en una lista y luego muestre el menor de todos ellos (Pista: para calcular el mínimo de una serie de datos deberemos partir de un valor inicial e irlo comparando con todos los de la lista; si el valor actual es menor que el mínimo, pasará a ser nuestro nuevo mínimo; en cuanto a ese "valor inicial", una forma "peligrosa" de obtenerlo es partir de uno claramente incorrecto, como "1000000" (que es mayor que todos los de la lista), y una forma más fiable es tomar como valor inicial el primer dato de la lista y después compararlo con los restantes).

  • 5.1.6. Crea un programa que pida al usuario 5 números reales y luego muestre el menor de todos ellos (pero sin almacenar todos los valores).

Para crear una matriz de dos dimensiones (realmente, una "lista de listas"), la alternativa más sencilla es indicar todos los valores iniciales, incluso aunque fueran cero todos ellos (pero pueden no serlo, o incluso ser de tipos de datos distintos):

datos = [
    ["uno", 2],
    ["a", "b", "c"]
]
print(datos)

Y si la matriz es de un tamaño grande, puede ser más cómodo crearla y rellenarla de forma repetitiva, así:

datos = [ [0 for columna in range(0,5)] for fila in range (0,4)]
datos[0][2] = 5
print(datos)

Ejercicios propuestos:

  • 5.1.7. Crea un programa que pida al usuario un bloque de 3x3 números enteros y luego muestre la media de las tres filas.

  • 5.1.8. Si tus conocimientos de matemáticas lo permiten, crea un programa que pida al usuario los datos de una matriz de 3x3 números reales y muestre el valor de su determinante.

  • 5.1.9. Crea un programa que pida al usuario un bloque de 3x3 números enteros y luego diga si alguna fila es múltiplo de otra.

Para manipulaciones numéricas más avanzadas que lo que hemos visto, no se recomienda usar el sistema básico de Python, sino una biblioteca de cálculo numérico llamado "numpy", algo en lo que no vamos a entrar por ahora.

De igual modo, también podemos crear "arrays" más parecidos a los de C y otros lenguajes, formados sólo por datos básicos (números enteros o números reales, por ejemplo). Para ello, deberíamos importar un módulo llamado "array", pero tampoco profundizaremos más en esa peculiaridad por ahora.

5.2. Cadenas de texto

El dato que recibimos del usuario con "input" es una cadena de texto. Podemos convertir a mayúsculas o minúsculas ese texto de forma muy sencilla, usando ".upper()" o ".lower()":

nombre = input( "Dime tu nombre: " )
print ( "En mayúsculas sería {}".format( nombre.upper() ) )
print ( "En minúsculas sería {}".format( nombre.lower() ) )

Extraer una letra de una cadena es como acceder a cualquier posición de una matriz o un vector: se indica la posición entre corchetes, como en "nombre[i]". Para obtener una subcadena, basta indica la posición inicial y la final, separadas por un símbolo de dos puntos: "nombre[desde:hasta]". Hay que recordar que se empieza a contar desde cero y que se termina en la longitud ("len") menos uno, y que, igual que ocurría con "range", el valor "hasta" no se llega a alcanzar:

nombre = input( "Dime tu nombre: " )
print ( "Con espacios sería" )
for i in range(0, len(nombre)):
    print ( nombre[i], end="" )
    print ( " ", end="" )
print()
print("Y las letras 2ª a 4ª son:")
print(nombre[1:4])

Concatenar cadenas (juntar dos textos en uno) es muy fácil: basta usar el símbolo de la suma (+):

nombre = "Juan"
espacio = " "
apellido = "Juanez"
frase = nombre + espacio + apellido
nprint ( frase )

Pero se pueden hacer muchas más cosas con las cadenas de texto y sus subcadenas si usamos esa nomenclatura de "corchetes" y "dos puntos".Por ejemplo, podemos emplear posiciones negativas para indicar que queremos contar desde el final de la cadena, o dejar una posición en blanco para decir "desde el principio" (si es la primera) o "hasta el final" (si es la segunda), o añadir un tercer dato para indicar de cuánto en cuánto hay que avanzar (y puede incluso ser un número negativo, para retroceder):

nombre = input( "Dime tu nombre: " )
print ( "Sus dos últimas letras son: ", end="" )
print ( nombre[-2:] )
print ( "Y a partir de la tercera: ", end="" )
print ( nombre[2:] )
print ( "Al revés sería: ", end="" )
print ( nombre[::-1] )

Como curiosidad, las cadenas en Python se pueden indicar entre comillas simples o dobles, indistintamente. Así, si queremos escribir algo entre comillas dobles, podemos usar la cadena con comillas simples, y viceversa. Incluso podemos crear un texto que abarque varias líneas, si lo delimitamos entre tres comillas (simples o dobles):

texto1 = "Hola"
texto2 = 'Adios'
explicacion = 'Dijo "De acuerdo"'
posesivo = "John's house"
variasLineas = """Esto
ocupa
varias líneas"""

Ejercicios propuestos:

  • 5.2.1. Crea un programa que pida su nombre y su (primer) apellido al usuario, A partir de estos datos, deberá crear una cadena que contenga el apellido, una coma, un espacio y el nombre, y deberá mostrarla en pantalla. Por ejemplo, si el nombre es "Nacho" y el apellido es "Cabanes", la cadena resultante será "Cabanes, Nacho"

  • 5.2.2. Crea un programa que pida su nombre al usuario y lo escriba alternando letras mayúsculas y minúsculas (por ejemplo, "Nacho" se mostraría como "NaChO"

  • 5.2.3. Crea un programa que pida su nombre al usuario y diga cuántas vocales contiene

  • 5.2.4. Crea un programa que pida su nombre al usuario y lo escriba centrado en pantalla (suponiendo que la pantalla tenga una anchura de 80 columnas) y con su primera letra en mayúsculas y el resto en minúsculas

  • 5.2.5. Crea un programa que pida al usuario 10 palabras y luego las muestre de la última a la primera

  • 5.2.6. Crea un programa que pida al usuario 10 palabras, las guarde en un array y luego le pregunte de forma repetitiva qué texto quiere buscar. Le responderá si dicho texto era alguno de lo que se habían introducido inicialmente. Dejará de repetirse cuando se introduzca "fin".

218717 visitas desde el 18-04-2019

AnteriorPosterior