|
|
|
|
Una lista es un conjunto de valores ordenados, donde cada valor se identifica con un índice. Los valores que configuran una lista se conocen como elementos. Las listas son similares a las cadenas, las cuales son también un conjunto de caracteres ordenados, exceptuando que el elemento de una lista puede ser de otro tipo. A las listas, las cadenas, y otras estructuras que se comportan como un conjunto de valores ordenados, se les llama secuencias.
Existen muchas maneras de crear un nueva lista; la más fácil consiste en adjuntar los elementos y ponerlos entre corchetes ([ y ] ):
[10, 20, 30, 40]
["caballo", "canguro", "burro"]
El primer ejemplo es un lista de cuatro números enteros. El segundo es una lista con tres elementos encadenados. Los elementos de una lista no tienen por qué ser del mismo tipo. La siguiente lista contiene una cadena de elementos, un número de coma flotante y un número entero, además de otra lista.
["hola", 2.0, 5, [10, 20]]
A una lista que incluye otra lista se le conoce como lista anidada.
Las listas que contienen números enteros consecutivos son muy comunes, por lo que Python proporciona una manera fácil de crearlas:
>>> rango(1,5)
[1, 2, 3, 4]
La función rango toma dos argumentos y devuelve una lista que contenga todos los números enteros desde el primero al segundo, incluyendo el primero pero no el segundo.
Existen otros dos tipos de funciones rango. Con un argumento simple, crea una lista que comienza por 0:
>>> rango(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Si hubiera un tercer argumento, se especifica el espacio que hay entre los valores sucesivos, a lo que se conoce como tamaño del paso. Este ejemplo cuenta del 1 al 10 en pasos de 2:
>>> rango(1, 10, 2)
[1, 3, 5, 7, 9]
Finalmente, existe una lista especial que no contiene elementos. Es una lista vacía, que se indica con [].
Con todas estas maneras de crear listas, podría decepcionar el hecho de que no se pudiera asignar a los valores de la lista, desde variables hasta grupos de listas como parámetros de función. Podemos hacer lo siguiente.
vocabulario = ["juzgar", "censurar", "criticar"]
números = [17, 123]
lista vacía= []
print vocabulario, números, lista vacía
['juzgar', 'censurar', 'criticar'] [17, 123] []
Comentarios
La sintaxis para acceder a los elementos de una lista es la misma que la sintaxis para acceder a los caracteres de un cadena, el operador paréntesis ([]). La expresión que está dentro de los corchetes especifica el índice. Recuerda que el índice empieza con 0:
print números[0]
números[1] = 5
El operador paréntesis puede aparecer en cualquier lugar de una expresión. Cuando aparece en el lado izquierdo de una asignación, se cambia uno de los elementos en un lista, por lo que el primer elemento desde el final, que solía ser 123, ahora es 5.
Se puede usar cualquier expresión con números enteros como un índice:
>>> números[3-2]
5
>>> números[1.0]
Error de tipo: el índice de la secuencia debe tener un número entero
Si intentas leer o escribir un elemento que no está en la lista, obtendrás un error de ejecución:
>>> números[2] = 5
Error en el índice: la asignación del índice de la lista no es correcto
Si un índice tiene un valor negativo, se empieza a contar desde el final de la lista:
>>> números[-1]
5
>>> números[-2]
17
>>> números[-3]
Error en el índice: el índice de la lista no es correcto
números[-1] es el último elemeto de la lista, números[-2]es el segundo que acaba, y números[-3] no existe.
Es muy común usar una variable bucle como un índice de lista.
jinetes = ["guerra", "hambruna", "pestilencia", "muerte"]
i = 0
while i < 4:
print jinetes[i]
i = i + 1
Este bucle while, cuenta de 0 a 4. Cuando la variable bucle i es 4, la condición falla y el bucle termina. Por lo tanto, el cuerpo del mensaje del bucle solo se ejecuta cuando i es 0, 1, 2, y 3.
Cada vez que usemos el bucle, la variable i se usa como un índice dentro de una lista, imprimiendo los elementos i. A esto se le conoce con el nombre de lista transversal. Comentarios
La función len nos indica cual es la longitud de la lista. Es un buena idea usar este valor como el límite superior de un bucle en lugar de una constante. De esta manea, si el tamaño de la lista cambia, no tendrás que volver al programa y cambiar todos los bucles, ellos funcionarán correctamene para cualquier tamaño de la lista:
jinetes = ["guerra", "hambruna", "pestilencia", "muerte"]
i = 0
while i < len(jinetes):
print jinetes[i]
i = i + 1
La última vez que se ejecutó el cuerpo del mensaje del bucle, i es len(jinetes) - 1, que es el índice del último elemento. . Cuando i es igual a len(jinetes), la condición falla y el cuerpo del mensaje no se ejecuta, lo que es bueno, porque len(jinetes) no es un índice legal.
Aunque la lista pueda incluir otra lista, la lista anidada todavía se considera un elemento simple. La longitud de esta lista es cuatro:
['carne!', 1, ['pescado', 'queso', 'tarta de manzana'], [1, 2, 3]]
Como ejercicio, escribe un bucle que transverse la lista anterior e imprima el tamaño de cada elemento. ¿Qué pasaría si introdujeras un entero en la función len?
in es un operador booleano que comprueba la pertenencia de un elemento a una secuencia. Esto lo hemos usado en la Sección 7.10 con las cadenas, pero también trabaja con listas y otras secuencias:
>>> jinetes = ['guerra', 'hambruna', 'pestilencia', 'muerte']
>>> 'pestilencia'in jinetes
1
>>> 'depravación'in jinetes
0
Desde que "pestilencia" es un mienbro de la lista jinetes, el operador in es verdadero (1). Desde que "depravación" no está en la lista, el operador in es falso (0).
Podemos usar el operador not en combinación con in para comprobar si un elemento no pertenece a la lista.
>>> 'depravación'not in jinetes
1
Comentarios
El bucle for que vimos en la Sección 7.3 también trabaja con listas. La sintaxis general de un bucle for es la siguiente:
for VARIABLE in LISTA:
CUERPO DE MENSAJE
Esta instrucción equivale a:
i = 0
while i < len(LISTA):
VARIABLE = LISTA[i]
CUERPO DE MENSAJE
i = i + 1
El bucle for es más conciso porque puede eliminar la variable bucle i. Aqui se muestra el bucle anterior escrito con un bucle for.
for jinete in jinetes:
print jinete
En español se leería así. "Para (cada) jinete en (la lista de) jinetes, imprimir (el nombre del) jinete."
Cada expresión de la lista se puede usar con el bucle for:
for número in range (20):
if número % 2 == 0:
print número
for fruta in ["plátano", "manzana", "melocotón"]:
print"Me gusta comer " + fruta + "s!"
El primer ejemplo imprime todos los números que hay entre uno y diecinueve. El segundo ejemplo expresa el entusiasmo por la fruta. Comentarios
El operador + concatena listas:
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> c = a + b
>>> print c
[1, 2, 3, 4, 5, 6]
De forma similar, el operador * repite una lista un número dado de veces:
>>> [0] * 4
[0, 0, 0, 0]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
El primer ejemplo repite el [0] cuatro veces. El segundo ejemplo repite la lista [1, 2, 3] tres veces. Comentarios
Las operaciones con segmentos que vimos en la Sección 7.4 también trabaja con listas:
>>> lista = ['a', 'b', 'c', 'd', 'e', 'f']
>>> lista[1:3]
['b', 'c']
>>> lista[:4]
['a', 'b', 'c', 'd']
>>> lista[3:]
['d', 'e', 'f']
>>> lista[:]
['a', 'b', 'c', 'd', 'e', 'f']
Comentarios
A diferencia de las cadenas, las listas son variables; es decir, pueden cambiar sus elementos. Mediante el operador paréntesis de la parte izquierda de una asignación, podemos actualizar uno de los elementos:
>>> fruta = ["plátano", "manzana", "melocotón"]
>>> fruta[0] = "pera"
>>> fruta[-1] = "naranja"
>>> print fruta
['pera', 'manzana', 'naranja']
Con el operador paréntesis, podemos actualizar varios elementos a la vez:
>>> lista = ['a', 'b', 'c', 'd', 'e', 'f']
>>> lista[1:3] = ['x', 'y']
>>> print lista
['a', 'x', 'y', 'd', 'e', 'f']
Podemos quitar elementos de una lista asignándoles la lista vacía:
>>> lista = ['a', 'b', 'c', 'd', 'e', 'f']
>>> lista[1:3] = ['x', 'y']
>>> print lista
['a', 'x', 'y', 'd', 'e', 'f']
Y podemos añadir elementos a una lista introduciéndolos en un segmento vacío en el lugar deseado:
>>> lista = ['a', 'd', 'f']
>>> lista[1:1] = ['b', 'c']
>>> print lista
['a', 'b', 'c', 'd', 'f']
>>> lista[4:4] = ['e']
>>> print lista
['a', 'b', 'c', 'd', 'e', 'f']
Comentarios
El uso de segmentos para suprimir elementos de una lista puede resultar difícil y, por tanto, llevar a errores. Python proporciona una alternativa que es más sencilla.
del quita un elemento de una lista:
>>> a = ['uno', 'dos', 'tres']
>>> del a[1]
>>> a
['uno', 'tres']
Como cabe esperar, del maneja índices negativos y provoca un error del tiempo de ejecución, si el índice está fuera del campo.
Puedes usar un segmento como si fuera un índice para la función del:
>>> lista = ['a', 'b', 'c', 'd', 'e', 'f']
>>> lista[1:5] = ['x', 'y']
>>> print lista
['a', 'x', 'y', 'd', 'e', 'f']
Como es habitual, los segmentos seleccionan todos los elementos hasta el segundo índice, pero éste no se incluye. Comentarios
Si ejecutamos estas instrucciones de asignación,
a = "plátano"
b = "plátano"
sabemos que a y b se referirán a una cadena con las letras "plátano". Pero, no podemos decir si señalan la misma cadena.
Hay dos casos posibles:
En el primer caso, a y b se refieren a dos cosas distintas que tienen el mismo valor. En el segundo caso, se refieren a la misma cosa. Estas "cosas" tienen nombres y se llaman objetos. Un objeto es algo a lo que se puede referir una variable.
Cada objeto tiene un único identificador, que podemos obtener con la función id. Si se imprime el identificador de ay b, podemos decir si refieren al mismo objeto.
>>> id(a)
135044008
>>> id(b)
135044008
De hecho, obtenemos el mismo identificador dos veces, lo que significa que Python solo creó una cadena y tanto a como b se refieren a ella.
Curiosamente, las listas se comportan de manera diferente. Si creamos dos listas, obtenemos dos objetos:
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> id(a)
135045528
>>> id(b)
135041704
Así que el diagrama se quedaría de la siguiente manera:
a y b tienen el mismo valor, pero no se refieren al mismo objeto. Comentarios
Debido a que las variables se refieren a objetos, si asignamos una variable a otra, ambas se refieren al mismo objeto:
>>> a = [1, 2, 3]
>>> b = a
En este caso, el diagrama se quedaría de la siguiente manera:
Debido a que la misma lista tiene dos nombres diferentes, a y b, podemos decir que tiene alias. Los cambios hechos a un alias afectan al otro:
>>> b[0] = 5
>>> print a
[5, 2, 3]
Aunque su comportamiento puede ser útil, algunas veces es inesperado o indeseado. En general, es más seguro evitar los alias si estás trabajando con objetos variables. Y, por supuesto, con los objetos invariables no hay problema. Esta es la razón por la que Python tiene la libertad de hacer alias para cadenas si considera que se puede economizar. Comentarios
Si queremos modificar una lista, y también mantener una copia del original, necesitamos hacer una copia de la propia lista y no solo una de la referencia. Algunas veces, se llama clonación a este proceso para evitar la ambigüedad de la palabra "copia".
La manera más fácil para clonar una lista es utilizar el operador para segmentación:
>>> a = [1, 2, 3]
>>> b = a[:]
>>> print b
[1, 2, 3]
Si cogemos cualquier segmento de a, se crea una nueva lista. En este caso, parece que el segmento está compuesto por toda la lista.
Ahora podemos realizar cambios a b sin preocuparnos de a:
>>> b[0] = 5
>>> print a
[1, 2, 3]
Como ejercicio, dibuja un diagrama para a y b antes y después de este cambio.
Al pasar una lista como un argumento, en realidad pasas una referencia a la lista y no, su copia. Por ejemplo, la función encabezado toma una lista como un parámetro y devuelve el primer elemento:
defencabezado(lista):
return lista[0]
Aquí se explica cómo se usa:
>>> números = [1, 2, 3]
>>> encabezado(números)
1
La lista de parámetro y los números variables son alias del mismo objeto. Así que el diagrama se quedaría de la siguiente manera:
Debido a que el objeto de la lista está dividido en dos partes, lo dibujamos entre ellas.
Si una función modifica un parámetro de la lista, el llamador ve el cambio. Por ejemplo, suprimirEncabezado suprime el primer elemento de una lista:
defsuprimirEncabezado(lista):
del lista[0]
Aquí se explica cómo usar suprimirEncabezado:
>>> números = [1, 2, 3]
>>> suprimir_encabezado(números)
>>> print números
[2, 3]
Si una función devuelve una lista, devuelve una referencia a la lista. Por ejemplo, cola devuelve una lista que contiene todo, excepto el primer elemento de la lista dada:
defcola(lista):
return lista[1]
Aquí se explica cómo se utiliza cola:
>>> números = [1, 2, 3] >>> rest = cola(números)
>>> print rest
[2, 3]
Como el valor de vuelta se creó con el operador de segmento, se ha creado una nueva lista. La creación de rest y cualquier cambio posterior a rest no afectan a los números. Comentarios
Una lista anidada es una lista que aparece dentro de otra como un elemento. En esta lista, los tres últimos elementos son una lista anidada.
>>> lista = ["hola", 2.0, 5, [10, 20]]
Si escribimos lista[3], obtenemos [10, 20]. Para extraer un elemento en una lista anidada, podemos seguir dos pasos:
>>> elt = lista[3]
>>> elt[0]
10
O podemos combinar ambos:
>>> lista[3][1]
20
Los operadores paréntesis evalúan de izquierda a derecha, de manera que esta expresión coge los tres últimos elementos de la lista y extrae su último elemento. Comentarios
Las listas anidadas se usan con frecuencia para representar matrices. Por ejemplo, la matriz:
se puede representar como:
>>> matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matriz es una lista con tres elementos, en la que cada uno es una fila de una lista. Podemos elegir una fila completa de la matriz siguiendo el modo habitual:
>>> matriz[1]
[4, 5, 6]
O podemos extraer un único elemento de la matriz mediante un índice doble:
>>> matriz[1][1]
5
El primer índice selecciona la fila y el segundo, la columna. Aunque esta manera de representar matrices es muy común, hay otras posibilidades. Una pequeña variación puede usar una lista de columnas en lugar de una lista de filas. Más adelante, veremos una alternativa más radical utilizando un diccionario. Comentarios
Las listas de cadenas son una de las dos funciones más útiles del módulo cadena. La función separar rompe la cadena en una lista de palabras. Por defecto, cualquier número de caracteres en blanco se considera el límite de una palabra:
>>> importcadena
>>> canción = "Llueve en Cuenca..."
>>> cadena.separa(canción)
['llueve', 'en', 'Cuenca..']
Un argumento opcional llamado delimitador se puede utilizar para especificar qué caracteres se pueden usar como límites de palabras. El siguiente ejemplo emplea la cadena ue como un delimitador.
>>> cadena.separar(canción, 'ue')
['ll''ve en C''nca...']
Fíjate en que el delimitador no aparece en la lista.
La función unir es opuesta a la función separar. Toma un elemento de la lista y une los elementos con un espacio entre cada pareja:
>>> lista = ['Llueve', 'en', 'Cuenca...']
>>> cadena.unir(lista)
'Llueve en Cuenca...'
Del mismo modo que separar, unir coge un delimitador opcional que se inserta entre los elementos. El delimitador por defecto es un espacio.
>>> cadena.unir(lista, '_')
'Llueve_en_Cuenca...'
Como ejercicio, describe la relación entre cadena.unir(cadena.separar(canción)) y canción. ¿Son iguales en todas las cadenas? ¿Cuándo serían diferentes?
|
|
|
|