Universidad de Costa Rica | Escuela de Ingeniería Eléctrica IE-0117 Programación Bajo Plataformas Abiertas Secuencias En Python, una secuencia es un objeto (o variable) que sirve como un contenedor para otros objetos. Las secuencias son ordenadas, cada uno de los objetos almacenados tiene una posición definida dentro de la secuencia. Las listas, las tuplas y las cadenas de caracteres son tres tipos de datos considerados como secuencias en Python. 1. Las listas Una lista es una secuencia mutable. Esto significa que los contenidos de una lista pueden ser modificados, cambiando, agregando o eliminando elementos. Al igual que otras variables en Python, las listas se crean al momento de declararlas: lista = [1, 2, 3, 4, 5, 6] Pueden crearse listas vacías: lista_vacia = [] Una lista puede contener elementos de distinto tipo, e incluso otras secuencias: lista = [1, "dos", u'áéíóú', 2+5j, [10, 20, 30]] 2. Las tuplas Al igual que las listas, las tuplas son colecciones ordenadas de objetos. Sin embargo, a diferencia de las listas, las tuplas son inmutables: una vez creadas no pueden modificarse. Las tuplas se crean de forma similar a las listas: tupla1 = (1, 2, 3, 4, 5) tupla2 = 'uno', 'dos', 'tres', 'cuatro', 'cinco' Si se quiere crear tuplas de un sólo elemento no bastan los paréntesis, debe agregarse una coma luego del elemento: tupla_uno1 = ('alfa',) tupla_uno2 = 'beta', # Pueden omitirse los paréntesis Las tuplas son estructuras de datos bastante simples. Generalmente se usan cuando es necesario agrupar varios valores o variables: print 'x1 = %f - x2 = %f' % (x1, x2) 3. Las cadenas de caracteres Las cadenas de caracteres también son consideradas secuencias. Cada carácter tiene una posición específica dentro de la cadena y puede accederse de forma independiente. Al igual que las tuplas, las cadenas de caracteres son inmutables. 1 IE-0117 Programación Bajo Plataformas Abiertas Secuencias Existen dos tipos de datos que permiten manejar cadenas de caracteres en Python: las cadenas convencionales (tipo donde cada carácter tiene un tamaño de 8 bits y las cadenas unicode (tipo unicode) en las que cada carácter se almacena usando el sistema de codificación universal Unicode1 . El uso de cadenas unicode permite garantizar que los caracteres podrán visualizarse correctamente, sin importar la codificación usada en el sistema. Para más información puede consultar el HOWTO de Unicode de Python2 . str), c1 = 'Esto es una cadena' c2 = u'Esto es una cadena Unicode' Las cadenas, tanto convencionales como unicode pueden crearse usando comillas simples ('cadena'), comillas dobles ("cadena") o bien tres comillas (dobles o simples) al inicio y al final. Si se usa esta última opción pueden usarse saltos de línea dentro de la comilla: cadena = """ Esta es una cadena que tiene varias líneas. Por eso se usan tres comillas """ Al igual que en otros lenguajes como C, C++ o Java es posible utilizar secuencias de escape para representar caracteres especiales como el salto de línea («\n») o la tabulación («\t»). La lista completa de las secuencias de escape disponibles en Python puede encontrarse en la documentación de referencia del lenguaje3 . En algunas ocasiones puede ser útil ignorar las secuencias de escape al crear una cadena. En este caso puede utilizarse una cadena sin procesar (raw string): cadena = r'En esta cadena no se procesarán los \n ni los \t' En el ejemplo anterior se crea una cadena sin procesar usando el prefijo r al declarar la cadena. Esto provoca que las secuencias de escape «\n» y «\t» no sean convertidas. El contenido de la cadena será: En esta cadena no se procesarán los \n ni los \t 3.1. Formateado de cadenas Es posible componer nuevas cadenas a partir de variables utilizando el formateado de cadenas. Esta funcionalidad permite controlar con precisión cómo se van a convertir a texto los valores almacenados en las variables. Por ejemplo, se tiene el siguiente código: a = 10 b = 2.567 cadena = "Las soluciones son a = %d y b = %.2f" % (a, b) print cadena El resultado de ejecutar estas líneas es: Las soluciones son a = 10 y b = 2.57 En este caso, la operación de formateado de cadenas sustituye el código de formato %d en la cadena por el valore de la primera variable de la tupla a la derecha del operador % (variable a) y el código %.2f por el valor de la segunda variable de la tupla redondeado a 2 decimales (varible b). El código utilizado va a depender del tipo de datos de la variable. %d 1 http://unicode.org/ 2 http://docs.python.org/howto/unicode.html 3 http://docs.python.org/reference/lexical_analysis.html#strings 2 IE-0117 Programación Bajo Plataformas Abiertas Secuencias representa un entero decimal, %f un número de punto flotante, %s una cadena de caracteres, etc. La lista completa de códigos de formateado puede consultarse en la documentación de Python4 . 4. Operaciones y métodos comunes a todas las secuencias 4.1. Acceso a los elementos de una secuencia Los elementos almacenados en una secuencia pueden accederse usando el operador []: lista = [1, 2, 3, 4, 5] tupla = (10, 20, 30, 40, 50) print lista[3] + tupla[0] 4.2. Particiones (slices) El operador [] también permite extraer una porción de una lista, si se especifica un rango: lista = ['a', 'b', 'c', 'd', 'e'] palabra = 'hipopotomonstrosesquipedaliofobia' part1 = lista [1:3] part2 = lista[:4] part3 = lista[3:] # part1 contiene ['b', 'c'] # part2 contiene ['a, 'b', 'c', 'd'] # part3 contiene ['d', 'e'] part4 = palabra[:3] part5 = palabra[5:10] part6 = [-5:] # part4 contiene "hip" # part5 contiene "otomo" # part6 contiene "fobia" Si se usan valores negativos para los límites del ámbito, la cuenta se hace desde el final de la secuencia. 4.3. La función len() La función len() es una función integrada de Python que retorna el tamaño de una secuencia o diccionario: lista = [10, 20, 30, 40, 50, 60] cadena = "En un lugar de La Mancha de cuyo nombre no quiero acordarme" print len(lista) print len(cadena) # imprime 6 # imprime 59 4 http://docs.python.org/library/stdtypes.html#string-formatting-operations 3 IE-0117 Programación Bajo Plataformas Abiertas Secuencias 4.4. Los operadores 'in' y 'not in' Es posible comprobar si un elemento se encuentra o no en una secuencia usando los operadores ’in’ o ’not in’: primos = [1, 2, 3, 5, 7, 11] numero = int(raw_input("Ingrese un número: ")) if numero in primos: print "El número es primo" else: print "El número no es primo" vocales = 'aeiou' letra = raw_input("Escriba una letra: ") if letra not in vocales: print "La letra ingresada no es una vocal" else: print "La letra ingresada es una vocal" 4.5. Iteración a través de los elementos de una secuencia En Python, el lazo for permite iterar a través de los elementos de una lista: lista = [1, 2, 3, 4, 5] suma = 0 for i in lista: suma += i print suma # Imprime '15' 4.6. Concatenación de secuencias El operador suma (+) permite concatenar (unir) dos secuencias: tup1 = (1, 2, 3) tup2 = (4, 5, 6) ntup = tup1 + tup2 # ntup contiene (1, 2, 3, 4, 5, 6) cad1 = "hola" cad2 = "mundo" ncad = cad1 + cad2 # ncad contiene "holamundo" 4 IE-0117 Programación Bajo Plataformas Abiertas Secuencias 4.7. Repetición de secuencias El operador multiplicación * permite repetir una secuencia un número determinado de veces: lista = ['uno', 'dos'] nlista = lista * 2 # nlista contiene ['uno', 'dos', 'uno', 'dos'] cadena = "Blah" ncadena = cadena * 5 4.8. # ncadena contiene "BlahBlahBlahBlahBlah" Desempaquetado de secuencias Es posible almacenar los valores contenidos en una secuencia dentro de variables escalares a través de una simple asignación: lista = [0.565, 7.344, -9.343] x, y, z = lista # Ahora x = 0.565, y = 7.344 y z = -9.343 Si la cantidad de valores en la lista es diferente a la cantidad de variables proporcionadas al lado izquierdo de la asignación, se producirá un error. 4.9. Métodos presentes en las secuencias Existen 2 métodos soportados en la mayoría de las secuencias (list, tuple, str y unicode): count(valor): retorna un entero con la cantidad de apariciones de valor dentro de la secuencia. index(valor): retorna el índice de la primera aparición de valor dentro de la lista. 5. Operaciones específicas de las listas 5.1. Borrado de elementos de una lista Es posible eliminar elementos de una lista usando el enunciado del: lista = [10, 20, 30, 40, 50] del lista[1] # lista ahora es [10, 30, 40, 50] 5.2. Métodos de listas Algunos de los métodos disponibles en un objeto lista son los siguientes: append(elemento): inserta elemento al final de una lista lista = [1, 2, 3, 4, 5] lista.append(100) # lista ahora contiene [1, 2, 3, 4, 5, 100] 5 IE-0117 Programación Bajo Plataformas Abiertas pop(): Secuencias elimina y retorna el último elemento de una lista lista = ['uno', 'dos', 'tres', 'cuatro', 'cinco'] a = lista.pop() # lista ahora es ['uno', 'dos', 'tres', 'cuatro']; # a = 'cinco' insert(pos, elemento): remove(elemento): sort(): inserta elemento en la posición pos de una lista elimina la primera aparición de elemento de la lista ordena la lista reverse(): invierte el orden de los elementos de la lista 5.3. Copia de listas Cuando se asigna una lista a otra variable no se crea una copia nueva, sino que la nueva variable se convierte en un alias para el mismo conjunto de datos: a = [1, 2, 3, 4, 5, 6, 7, 8] b = a En el ejemplo, cualquier modificación que se haga en b se hará también en a, debido a que ambas variables se refieren a los mismos datos. Si se quiere una hacer una copia real debe obtenerse una partición que incluya la lista completa: a = [1, 2, 3, 4, 5, 6, 7, 8] b = a[:] 6. Operaciones específicas de las cadenas Existen varios métodos disponibles en los objetos del tipo str o unicode que permiten modificar o realizar pruebas sobre cadenas de caracteres. Debe recordarse que las cadenas son objetos inmutables, por lo que los métodos no modifican la cadena original sino que retornan una nueva cadena. Algunos de los métodos disponibles son: capitalize(): Retorna una copia de la cadena con la primera letra en mayúscula y el resto en minúscula. upper(): Retorna una copia de la cadena con todas las letras en mayúscula. lower(): Retorna una copia de la cadena con todas las letras en minúscula. isalpha(): Retorna verdadero si todos los caracteres de la cadena son letras. isdigit(): Retorna verdadero si todos los caracteres de la cadena son dígitos. join(secuencia): Retorna una nueva cadena con todos los elementos del objeto iterable secuencia unidos por el o los caracteres contenidos en la cadena. 6 IE-0117 Programación Bajo Plataformas Abiertas Secuencias Por ejemplo, si se tiene la secuencia a = [1, 2, 3, 4, 5] puede aplicarse el método join() sobre distintas cadenas como se muestra a continuación: cadena1 = '.'.join(a) cadena2 = ':'.join(a) cadena3 = '//'.join(a) split(delimitador): rador. Ejemplos: # cadena1 es '1.2.3.4.5' # cadena2 es '1:2:3:4:5' # cadena2 es '1//2//3//4//5' Retorna una lista con el contenido de la cadena, separado en cada aparición de la cadena sepa- cadena1 = 'a b c d e' lista1 = cadena1.split(' ') # lista1 es ['a', 'b', 'c', 'd', 'e'] cadena2 = 'www-data:x:33:33:www-data:/var/www:/bin/sh' lista2 = cadena2.split(':') # lista2 es ['www-data', 'x', '33', '33', 'www-data', # '/var/www', 'bin/sh'] La lista completa de métodos puede encontrarse en la documentación de Python5 . 7. La función range() La función range() retorna una lista con todos los valores dentro del ámbito especificado, utilizando un paso predeterminado de 1 entre cada valor: lista = range(1, 10) # lista es [1, 2, 3, 4, 5, 6, 7, 8, 9] lista = range(5) # lista es [0, 1, 2, 3, 4] El paso puede modificarse pasando un tercer argumento a la función: lista = range (10, 100, 10) # lista contiene [10, 20, 30, 40, 50, 60, 70, 80, 90] 8. Comprensión de listas La comprensión de listas permite aplicar principios de programación funcional para aplicar operaciones a todos los elementos de una lista. Por ejemplo, si se desea crear una lista que contenga el cuadrado de los elementos de una lista original, puede hacerse tradicionalmente usando un for: orig = [1, 2, 3, 4, 5] cuad = [] for x in orig: cuad.append(x * x) print cuad # imprime [1, 4, 8, 16, 25] Usando comprensión de listas, esto podría hacerse de la siguiente forma: orig = [1, 2, 3, 4, 5] cuad = [x * x for x in orig] print cuad # imprime [1, 4, 8, 16, 25] 5 http://docs.python.org/library/stdtypes.html#string-methods 7 IE-0117 Programación Bajo Plataformas Abiertas Secuencias Es posible usar el enunciado if para seleccionar sólo ciertos elementos de la lista: orig = range(1, 10) nueva_lista = [i * 10 for i in orig if i % 2 == 0] print nueva_lista # imprime [20, 40, 60, 80] 8