Podemos asignar valores a elementos particulares de una lista gracias al operador de indexación.
Cada celda de una lista es, en cierto modo, una variable autónoma: podemos almacenar en
ella un valor y modificarlo a voluntad.
>>> a = [1, 2, 3]
>>> a[1] = 10
>>> a
[1, 10, 3]
CAPITULO 5.2.5
MUTABILIDAD, INMUTABILIDAD Y REPRESENTACION DE LA INFORMACION EN MEMORIA
>>> a = 1 + 1
>>> b = 2 * 1
>>> c = ’Python’
>>> d = c
>>> e = ’Py’ + ’thon’
Que las cadenas Python sean inmutables tiene efectos sobre las operaciones que podemos efectuar con ellas. La asignaci´on a un elemento de una cadena, por ejemplo está prohibida, así que Python la señala con un ((error de tipo)) (TypeError):
>>> a = ’Hola’
>>> a[0] = ’h’
Traceback (innermost last):
File "
TypeError: object doesn’t support item assignment
Las listas se comportan de forma diferente: a diferencia de las cadenas, son mutables.
Modifiquemos ahora el contenido de una celda de una de las listas:
>>> d[2] = 3
CAPITULO 5.2.6
ADICION DE ELEMENTOS A UNA LISTA
Podemos añadir elementos a una lista, esto es, hacerla crecer.
¡Claro!, el operador de concatenación trabaja con dos listas, no con una lista y un entero, así que el elemento a añadir debe formar parte de una lista. . . aunque ésta sólo tenga un elemento:
>>> a = a + [4]
>>> a
[1, 2, 3, 4]
Existe otro modo efectivo de a˜nadir elementos a una lista: mediante el método append (que en inglés significa ((añadir))). Observa como usamos append:
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
Hay una diferencia fundamental entre usar el operador de concatenación + y usar append:
la concatenación crea una nueva lista copiando los elementos de las listas que participan como
operandos y append modifica la lista original.
¿Por qué complicarse la vida con append, cuando la concatenación hace lo mismo y nos asegura trabajar con una copia de la memoria? Por eficiencia: es más eficiente hacer append que concatenar. Concatenar supone crear una lista nueva en la que se copian todos y cada uno de los elementos de las listas concatenadas.
CAPITULO 5.2.7
Hasta el momento hemos aprendido a construir listas de diferentes modos, pero nada hemos dicho acerca de cómo leer listas desde el teclado. La función que lee de teclado es raw_input, ¿funcionará también con listas?
>>> lista = raw_input(’Dame una lista: ’)
Dame una lista: [1, 2, 3]
>>> lista
’[1, 2, 3]’
¿Ha funcionado? No. Lo que se ha leído es una cadena, no una lista. Se puede advertir en
las comillas que rodean el texto de la respuesta. Podemos cerciorarnos accediendo a su primer
elemento: si fuera una lista, valdr´ıa 1 y si fuera una cadena, ’[’.
>>> lista[0]
’[’
De todos modos, era previsible, pues ya dijimos en su momento que raw_input devolvía
una cadena. Cuando queríamos obtener, por ejemplo, un entero, ((encerrábamos)) la llamada a
raw_input con una llamada a la función int y cuando queríamos un flotante, con float. ¿Habrá
alguna función similar para obtener listas? Si queremos una lista, lo lógico sería utilizar una
llamada a list, que en inglés significa lista:
>>> lista = list(raw_input(’Dame una lista: ’))
Dame una lista: [1, 2, 3]
>>> lista
[’[’, ’1’, ’,’, ’ ’, ’2’, ’,’, ’ ’, ’3’, ’]’]
¡Oh, oh! Tenemos una lista, sí, pero no la que esperábamos:
La función list devuelve una lista a partir de una cadena, pero cada elemento de la lista es un
car´acter de la cadena (por ejemplo, el 2 que ocupa la posición de índice 5 no es el entero 2,
sino el carácter 2). No se interpreta, pues, como hubiéramos deseado, es decir, como esta lista
de números enteros.
Para leer listas deberemos utilizar un método distinto. Lo que haremos es ir leyendo la lista
elemento a elemento y construir la lista paso a paso. Este programa, por ejemplo, lee una lista
de 5 enteros:
lista = []
for i in range(5):
elemento = int(raw_input(’Dame un elemento:’))
lista = lista + [elemento]
Mejor aún: si usamos append, evitaremos que cada concatenación genere una lista nueva copiando
los valores de la antigua y añadiendo el elemento recién leído.
lista = []
for i in range(5):
elemento = int(raw_input(’Dame un elemento:’))
lista.append(elemento)
Existe un método alternativo que consiste en crear una lista con 5 celdas y leer después el
valor de cada una:
lista = [0] * 5
for i in range(5):
elemento[i] = int(raw_input(’Dame un elemento:’))
Supongamos que deseamos leer una lista de enteros positivos cuya longitud es desconocida.
¿Cómo hacerlo? Podemos ir leyendo números y añadiéndolos a la lista hasta que nos introduzcan
un número negativo. El número negativo indicará que hemos finalizado, pero no se añadirá a
la lista:
lista = []
numero = int(raw_input(’Dame un número: ’))
while numero >= 0:
lista.append(numero)
numero = int(raw_input(’Dame un número: ’))
No hay comentarios:
Publicar un comentario