Las listas y las cadenas de caracteres (strings) son dos tipos de objeto de los denominados secuencias.
Como tales, las listas y las cadenas de caracteres comparten varias funciones y métodos, aunque también tienen diferencias.
Las cadenas de caracteres son:
Las listas, por su parte, son:
Una vez que una lista está definida, sus elementos pueden accederse mediante su índice.
lista = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(lista)
lista[0]
Puede accederse a una porción de una lista, indicando un rango entre dos índices separado por dos puntos. Por ejemplo, para ir del elemento de índice 0 hasta el índice 3, pero sin incluirlo:
lista[0:3]
Omitiendo el índice inicial, se entiende que se comienza en el primer elemento.
lista[:3]
Omitiendo el segundo índice, se llega hasta el final de la lista.
lista[5:]
Por lo tanto, omitiendo ambos índices se recorre toda la lista.
lista[:]
Se pueden usar índices negativos; -1 corresponde al último elemento de la lista, y -len(lista) corresponde al primer elemento.
lista[1:-1]
Opcionalmente se puede dar un tercer argumento, para determinar el incremento (por defecto, 1).
lista[1:8:2]
lista[1:8:3]
Si se ingresa un índice que excede el rango de la lista, genera un error:
lista[10]
Las mismas operaciones son válidas para las cadenas de caracteres.
cadena = "En un lugar de la Mancha"
print(cadena)
cadena[0]
cadena[-1]
cadena[3:9]
cadena[4:-1:2]
cadena[-1::-1]
El operador + sirve para concatenar secuencias del mismo tipo, tanto cadenas como listas.
cadena = "foo" + "bar"
print(cadena)
lista = ['A', 1] + ['B', 2]
print(lista)
linea = '-' * 80
print(linea)
lista_rep = ['A', 1] * 5
print(lista_rep)
Devuelve la longitud (cantidad de elementos) de una secuencia, tanto lista como cadena de caracteres.
lista_len = [1, 2, 3, 'A', 'B', 'C', [100, 'foo']]
cadena_len = "cadena de caracteres"
print(len(lista_len))
print(len(cadena_len))
Estas funciones devuelven el mínimo y el máximo respectivamente, de una secuencia. Pueden aplicarse sin limitaciones a cualquier cadena.
cadena_m = "TheQuickBrownFoxJumpsOverTheLazyDog"
print(min(cadena_m))
print(max(cadena_m))
En el caso de las listas, estas funciones sólo pueden aplicarse si la lista es homogénea.
lista_1 = [13, 23, 77, 9]
print(min(lista_1))
print(max(lista_1))
lista_2 = ['foo', 'bar', 'hola Python', 'zz']
print(min(lista_2))
print(max(lista_2))
Estas funciones no pueden operar sobre listas heterogéneas, que no son ordenables.
lista_3 = ['foo', 23, 11, 'bar']
print(max(lista_3))
Esta función también puede aplicarse solamente a listas homogéneas, cuyos elementos sean todos de tipo numérico.
lista_4 = [1, 2, 3, 4]
print(sum(lista_4))
La función sorted() devuelve una lista ordenada de los elementos de la secuencia que recibe como argumento (lista o cadena). La secuencia original no es modificada.
lista = [23, 13, 7, 37]
print(sorted(lista))
print(lista)
La función sorted() siempre devuelve una lista, aunque reciba como argumento una cadena de caracteres.
cadena = "asdlk"
print(sorted(cadena))
El operador in verifica si un elemento pertenece a una secuencia (lista o cadena), y devuelve la variable booleana True or False correspondiente.
"o" in "foo"
"x" in "foo"
lista_a = [12, 32, 14]
12 in lista_a
13 in lista_a
Como se vio en la clase 3, el operador in también se utiliza para recorrer secuencias u otros objetos iterables, en los ciclos generados por un for.
for i in lista_a:
print(i)
Es el contrario de in, devuelve verdadero cuando un elemento no está en una secuencia.
"o" not in "foo"
"x" not in "foo"
Por ser secuencias mutables, las listas admiten operaciones que las modifican.
Mediante el operador de asignación, se puede modificar el elemento correspondiente a un índice determinado.
mi_lista = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(mi_lista)
mi_lista[0] = "A"
print(mi_lista)
mi_lista[0:3] = "B"
print(mi_lista)
mi_lista[0:1] = [0, 1, 2]
print(mi_lista)
mi_lista[-1:] = ['A', 'B']
print(mi_lista)
Se pueden eliminar elementos o porciones de lista con el operador del.
mi_lista = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(mi_lista)
del(mi_lista[0])
print(mi_lista)
del(mi_lista[7:])
print(mi_lista)
del(mi_lista[0:5:2])
print(mi_lista)
Los métodos son funciones que se aplican a un determinado tipo de objeto.
Agrega un elemento al final de una lista.
mi_lista = [0, 1, 2, 3, 4]
print(mi_lista)
mi_lista.append("A")
print(mi_lista)
Extiende una lista agregando un iterable al final.
mi_lista = [0, 1, 2]
print(mi_lista)
mi_lista.extend([3, 4, 5])
print(mi_lista)
mi_lista.extend(range(6,9))
print(mi_lista)
Ordena los elementos de una lista.
mi_lista = [4, 7, 5, 2, 11, 6]
print(mi_lista)
mi_lista.sort()
print(mi_lista) # la lista está ahora ordenada
La función sort() admite la opción reverse, por defecto, con valor False.
De tener valor True, el ordenamiento se hace en sentido inverso.
otra_lista = [13, 17, 5, 9, 11, 6]
otra_lista.sort(reverse=True)
print(otra_lista)
Invierte el orden de los elementos de una lista.
mi_lista = [4, 7, 5, 2, 11, 6]
print(mi_lista)
mi_lista.reverse()
print(mi_lista)
Esta función recibe un elemento como argumento, y cuenta la cantidad de veces que aparece en la lista.
lista = [3, 5, 11, 13, 5, 7, 3, 5]
print("11 -> ", lista.count(11))
print("5 -> ", lista.count(5))
print("9 -> ", lista.count(9))
Recibe un elemento como argumento, y devuelve el índice de su primera aparición en la lista.
lista = [3, 5, 11, 13, 5, 7, 3, 5]
print(lista.index(5))
La función admite como argumento adicional un índice inicial a partir de donde comenzar la búsqueda, opcionalmente también el índice final.
lista = [3, 5, 11, 13, 5, 7, 3, 5]
print(lista.index(5, 3))
La función devuelve un error si el elemento no se encuentra en la lista, o en el entorno definido.
lista = [3, 5, 11, 13, 5, 7, 3, 5]
print(lista.index(9))
La función se invoca de esta manera:
lista.insert(i, x)
Inserta el elemento x en la lista, en el índice i.
lista = [3, 5, 11, 13, 5, 7, 3, 5]
lista.insert(2, "foo")
print(lista)
Recibe como argumento un elemento, y borra su primera aparición en la lista.
lista = [3, 5, 11, 13, 5, 7, 3, 5]
lista.remove(5)
print(lista)
Devuelve un error si el elemento no se encuentra en la lista.
Devuelve el último elemento de la lista, y lo borra de la misma.
lista = [3, 5, 11, 13, 5, 7, 3, 5]
print(lista.pop())
print(lista)
Opcionalmente puede recibir un argumento numérico, que funciona como índice del elemento (por defecto, -1)
lista = [3, 5, 11, 13, 5, 7, 3, 5]
print(lista.pop(2))
print(lista)
lista_extension = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(lista_extension)
lista_list = list(range(10))
print(lista_list)
lista_loop = []
for i in range(10):
lista_loop.append(i)
print(lista_loop)
lista_comprension = [x for x in range(10)]
print(lista_comprension)
La forma general de la definición de una lista por comprensión es:
[expresión for ítem in iterable]
Opcionalmente, se puede incluir un condicional en la expresión:
[expresión for ítem in iterable if condición]
expresión puede ser cualquier expresión computable en Python, generalmente involucrando un ítem del iterable iterable puede ser cualquier objeto iterable, como una secuencia (lista o cadena), la función range(), etc.
La salida siempre es una lista.
# crea una lista de números por extensión
numeros = [23, 7, 11, 41, 13, 38]
# eleva al cuadrado los números de la listas que sean menores que 20
# y crea una nueva lista
cuadrados = [x**2 for x in numeros if x < 20]
print(cuadrados)
cadena = "Hola Python"
lista = [x*2 for x in cadena if x != " "]
print(lista)
La biblioteca estándar de Python incluye un conjunto de módulos que agregan funciones especiales al lenguaje.
La forma de importar un módulo es mediante la instrucción import, y la sintaxis estándar es:
import modulo
Las funciones que aporta el módulo estarán disponibles de esta manera:
modulo.funcion()
El módulo math agrega un conjunto de funciones matemáticas (log, factorial, sqrt, funciones trigonométricas, etc), así como también algunas constantes tales como pi o e [ https://docs.python.org/3/library/math.html ].
import math
print("raíz cuadrada de 2:", math.sqrt(2))
print("factorial de 12:", math.factorial(12))
print("3/2 expresado en cents:", 1200 * math.log(3/2, 2))
print("valor de la constante π:", math.pi)
print("seno de π/2:", math.sin(math.pi/2))
Otro módulo numérico es random, que incluye un conjunto de funciones para la generación de números pseudo-aleatorios de distintas características [ https://docs.python.org/3/library/random.html ].
El módulo random tiene funciones para operar sobre números enteros, sobre números de coma flotante, y sobre secuencias.
La función puede invocarse con uno, dos, o tres argumentos:
random.randrange(stop)
random.randrange(start, stop[, step])
y devuelve un entero aleatorio dentro del rango definido.
Los argumentos se comportan como en la función range():
- con un único argumento, la función devuelve un entero aleatorio entre 0 y stop-1
- con dos argumentos, devuelve un entero aleatorio entre start y stop-1
- el tercer argumento opcional determina el incremento.
print(random.randrange(10))
print(random.randrange(10, 20))
print(random.randrange(50, 100, 5))
La función se invoca:
random.randint(a, b)
y devuelve un número entero aleatorio N tal que a <= N <= b.
Es equivalente a randrange(a, b+1).
print(random.randint(10, 20))
El módulo random dispone de una serie de funciones que generan números pseudo-aleatorios de diferentes distribuciones.
Algunas de las más importantes son:
Devuelve un número aleatorio de coma flotante (con distribución uniforme) en el rango [0.0, 1.0)
La función se invoca:
random.uniform(a, b)
y devuelve un número aleatorio de coma flotante (con distribución uniforme) en el rango [a, b]
La función se invoca:
random.triangular(low, high, mode)
Devuelve un número aleatorio de coma flotante con distribución triangular en el rango [low, high], que por defecto valen 0 y 1 respectivamente.
El argumento mode por defecto es el valor intermedio entre low y high, generando así una distribución simétrica.
import random
# crea una lista invocando 50 veces la función random.triangular()
# por defecto: low = 0, high = 1, mode = 0.5
triangular_simetrica = [round(random.triangular(), 2) for i in range(50)]
print(triangular_simetrica)
triangular_simetrica.sort()
print(triangular_simetrica)
# distribución asimétrica com mode = 0.9
triangular_asimetrica = [round(random.triangular(0, 1, 0.9), 2) for i in range(50)]
print(triangular_asimetrica)
triangular_asimetrica.sort()
print(triangular_asimetrica)
La función se invoca:
random.gauss(mu, sigma)
y devuelve un número aleatorio de coma flotante con distribución gaussiana (distribución normal), de media mu y desviación estándar sigma.
La función se invoca:
random.choice(secuencia)
y devuelve un elemento aleatorio de la secuencia.
import random
lista = ["foo", 17, "bar", 23, "hola"]
cadena = "asldkfjowerldjf"
print(random.choice(lista))
print(random.choice(cadena))
La función se invoca:
random.shuffle(secuencia)
Reordena aleatoriamente los elementos de una secuencia.
lista = [x for x in range(10)]
print(lista)
random.shuffle(lista)
print(lista)
Modifica la secuencia en el lugar, y por lo tanto puede operar en listas pero no en cadenas, que son inmutables.
La función se invoca:
random.sample(secuencia, k)
Devuelve una lista de k elementos elegidos aleatoriamente de secuencia.
Si k == len(secuencia), el resultado es una permutación aleatoria de los elementos de la secuencia. A diferencia de random.shuffle(), la secuencia original no es modificada.
Generar series dodecafónicas aleatorias a partir de una lista ordenada de las doce clases de altura.
import random
# lista ordenada de las 12 clases de altura
k = 12
total_cromatico = [x for x in range(k)]
# se generan permutaciones aleatorias del total cromático
serie1 = random.sample(total_cromatico, k)
serie2 = random.sample(total_cromatico, k)
serie3 = random.sample(total_cromatico, k)
print(total_cromatico)
print(serie1)
print(serie2)
print(serie3)
Como la función opera sobre la secuencia sin modificarla, puede aplicarse tanto a listas como a cadenas de caracteres. Siempre devuelve una lista.
import random
cadena = "asdlkjfh"
print(random.sample(cadena, 3))
print(random.sample(cadena, 6))
Inicializa el generador de números aleatorios.
Si se le pasa un argumento entero, se usa como semilla, garantizando el mismo resultado cada vez que se ejecuta el código.
Si se deja vacío (o se usa un objeto de tipo None), se inicializa con el reloj del sistema
import random
random.seed(1)
print(random.randrange(1000))
print(random.randrange(1000))
random.seed()
print(random.randrange(1000))
print(random.randrange(1000))
# el módulo time provee varias funciones relacionadas
# con el tiempo coronométrico y el reloj
from time import ctime
# la función ctime() devuelve la fecha completa
# indicada por el reloj del sistema
fecha = ctime()
print(fecha)
La referencia de los módulos disponibles en la biblioteca estándar de Python3 se puede encontrar en:
https://docs.python.org/3/library/index.html
Ejemplo de salida:
8 1.0 0 9 1.125 204 10 1.25 386 11 1.375 551 12 1.5 702 13 1.625 841 14 1.75 969 15 1.875 1088 16 2.0 1200
Utilizando las dos funciones anteriores, crear una función que devuelva la matriz serial de una serie dada.