Sei sulla pagina 1di 22

Inicio Libros Tutoriales Eventos Foro Buscar

Libros / Algoritmos de Programacin con Python / Captulo 7. Tuplas y listas / 7.2. Listas

7.2. Listas
Presentaremos ahora una nueva estructura de datos: la lista. Usaremos listas para poder
modelar datos compuestos pero cuya cantidad y valor varan a lo largo del tiempo. Son
secuencias mutables y vienen dotadas de una variedad de operaciones muy tiles.

La notacin para lista es una secuencia de valores encerrados entre corchetes y


separados por comas. Por ejemplo, si representamos a los alumnos mediante su
nmero de padrn, se puede tener una lista de inscritos en la materia como la siguiente:
i [78455, 89211, 66540, 45750] . Al abrirse la inscripcin, antes de que hubiera
inscritos, la lista de inscritos se representar por una lista vaca: [] .

7.2.1. Longitud de la lista. Elementos y segmentos de listas


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Como a las secuencias ya vistas, a las listas tambin se les puede aplicar la funcin
len() para conocer su longitud.

Para acceder a los distintos elementos de la lista se utilizar la misma notacin de


ndices de cadenas y tuplas, con valores que van de 0 a la longitud de la lista 1 .

>>> xs=[78455, 89211, 66540, 45750]


>>> xs[0]
78455
>>> len(xs)
4
>>> xs[4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> xs[3]
45750

Para obtener una sublista a partir de la lista original, se utiliza la notacin de rangos,
como en las otras secuencias.

Para obtener la lista que contiene slo a quin se inscribi en segundo lugar podemos
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
escribir:

>>> xs[1:2]
[89211]

Para obtener la lista que contiene al segundo y tercer inscritos podemos escribir:

>>> xs[1:3]
[89211, 66540]

Para obtener la lista que contiene al primero y segundo inscritos podemos escribir:

>>> xs[:2]
[78455, 89211]

7.2.2. Cmo mutar listas


Dijimos antes que las listas son secuencias mutables. Para lograr la mutabilidad Python
provee operaciones que nos permiten cambiarle valores, agregarle valores y quitarle
valores.

Para cambiar una componente de una lista, se selecciona la componente mediante su


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
ndice y se le asigna el nuevo valor:

>>> xs[1]=79211
>>> xs
[78455, 79211, 66540, 45750]

Para agregar un nuevo valor al final de la lista se utiliza la operacin append().


Escribi-mos xs.append(47890) para agregar el padrn 47890 al final de xs`.

>>> xs.append(47890)
>>> xs
[78455, 79211, 66540, 45750, 47890]
>>>

Para insertar un nuevo valor en la posicin cuyo ndice es k (y desplazar un lugar el


resto de la lista) se utiliza la operacin insert() .

Escribimos xs.insert(2, 54988) para insertar el padrn 54988 en la tercera posicin


de xs .

>>> xs.insert(2, 54988)


>>> xs
[78455, 79211, 54988, 66540, 45750, 47890]
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
NOTA
Las listas no controlan si se insertan elementos repetidos, si necesitamos exigir
unicidad, debemos hacerlo mediante el cdigo de nuestros programas.

>>> xs.insert(1,78455)
>>> xs
[78455, 78455, 79211, 54988, 66540, 45750, 47890]

Para eliminar un valor de una lista se utiliza la operacin remove() .

Escribimos xs.remove(45750) para borrar el padrn 45750 de la lista de inscritos:

>>> xs.remove(45750)
>>> xs
[78455, 78455, 79211, 54988, 66540, 47890]

Si el valor a borrar est repetido, se borra slo su primera aparicin:

>>> xs.remove(78455)
>>> xs

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
[78455, 79211, 54988, 66540, 47890]

ADVERTENCIA
Si el valor a borrar no existe, se produce un error:

>>> xs.remove(78)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

7.2.3. Cmo buscar dentro de las listas


Queremos poder formular dos preguntas ms respecto de la lista de inscritos:

Est la persona cuyo padrn es v inscripta en esta materia?

En qu orden se inscribi la persona cuyo padrn es v ?.

Veamos qu operaciones sobre listas se pueden usar para lograr esos dos objetivos:
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Para preguntar si un valor determinado es un elemento de una lista usaremos la
operacin in :

>>> xs
[78455, 79211, 54988, 66540, 47890]
>>> 78 in xs
False
>>> 66540 in xs
True
>>>

NOTA
Esta operacin se puede utilizar para todas las secuencias, incluyendo tuplas y
cadenas

Para averiguar la posicin de un valor dentro de una lista usaremos la operacin


index() .

>>> xs.index(78455)
0

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
>>> xs.index(47890)
4

ADVERTENCIA
Si el valor no se encuentra en la lista, se producir un error:

>>> xs.index(78)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.index(x): x not in list

Si el valor est repetido, el ndice que devuelve es el de la primera aparicin:

>>> ys=[10,20,10]
>>> ys.index(10)
0

NOTA

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Esta operacin est disponible en cadenas, pero no en tuplas.

Para iterar sobre todos los elementos de una lista usaremos una construccin for :

>>> zs = [5, 3, 8, 10, 2]


>>> for x in zs:
... print x
...
5
3
8
10
2

NOTA
Esta construccin se puede utilizar sobre cualquier secuencia, incluyendo tuplas y
cadenas.

En Python, las listas, las tuplas y las cadenas son parte del conjunto de las secuencias.
Todas las secuencias cuentan con las siguientes operaciones:
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Operacin Resultado

x in s Indica si la variable x se encuentra en s

s + t Concantena las secuencias s y t

s * n Concatena n copias de s

s[i] Elemento i de s , empezando por 0

s[i:j] Porcin de la secuencia s desde i hasta j (no inclusive)

s[i:j:k] Porcin de la secuencia s desde i hasta j (no inclusive), con paso k

len(s) Cantidad de elementos de la secuencia s

min(s) Mnimo elemento de la secuencia s

max(s) Mximo elemento de la secuencia s

Problema 7.1. Queremos escribir un programa que nos permita armar la lista de los
inscritos de una materia.

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
1. Anlisis: El usuario ingresa datos de padrones que se van guardando en una lista.

2. Especificacin: El programa solicitar al usuario que ingrese uno a uno los padrones
de los inscritos. Con esos nmeros construir una lista, que al final se mostrar.

3. Diseo: Qu estructura tiene este programa? Se parece a algo conocido?

Es claramente un ciclo en el cual se le pide al usuario que ingrese uno a uno los
padrones de los inscritos, y estos nmeros se agregan a una lista. Y en algn momento,
cuando se terminaron los inscritos, el usuario deja de cargar.

El ciclo es definido o indefinido?

Para que fuera un ciclo definido deberamos contar de antemano cuntos inscritos
tenemos, y luego cargar exactamente esa cantidad, pero eso no parece muy til.

Estamos frente a una situacin parecida al problema de la lectura de los nmeros, en el


sentido de que no sabemos cuntos elementos queremos cargar de antemano. Para ese
problema, en 5.3, vimos una solucin muy sencilla y c6moda: se le piden datos al
usuario y, cuando se cargaron todos los datos se ingresa un valor distinguido (que se
usa slo para indicar que no hay ms informacin). A ese diseo lo hemos llamado ciclo
con centinela y tiene el siguiente esquema:

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Pedir datos.

Mientras el dato pedido no coincida con el centinela:


Realizar clculos.

Pedir datos.

Como sabemos que los nmeros de padrn son siempre enteros positivos, podemos
considerar que el centinela puede ser cualquier nmero menor o igual a cero. Tambin
sabemos que en nuestro caso tenemos que ir armando una lista que inicialmente no
tiene ningn inscripto.

Modificamos el esquema anterior para ajustarnos a nuestra situacin:

La lista de inscritos es vaca.

Pedir padrn.

Mientras el padrn sea positivo:


Agregar el padrn a la lista.

Pedir padrn.

2. Implementacin: De acuerdo a lo diseado en el prrafo anterior, el programa


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
quedara como se muestra en el cdigo 7.1.

# inscritos.py: Permite ingresar padrones de alumnos inscritos


#!/usr/bin/env python*
# encoding: latin1*
""" Mdulo para inscribir alumnos al curso - versin 0 """

# Iniciamos la interaccin con el usuario*


print "Inscripcion en el curso 04 de 75.40"

# Leemos el primer padrn*


padron=input("Ingresa un padrn (<=0 para terminar): ")

# Procesamos los padrones*


# Inicialmente no hay inscritos*
ins = []
while padron > 0:
# Agregamos el padrn ledo a la lista de inscritos*
ins.append(padron)

# Leemos otro padrn ms*


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
padron=input("Ingresa un padrn (<=0 para terminar): ")

# Mostramos el resultado*
print "Esta es la lista de inscritos: ", ins

5. Prueba: Para probarlo lo ejecutamos con algunos lotes de prueba (inscripcin de tres
alumnos, inscripcin de cero alumnos, inscripcin de alumnos repetidos):

Inscripcin en el curso 04 de 75.40


Ingresa un padrn (<=0 para terminar): 30
Ingresa un padrn (<=0 para terminar): 40
Ingresa un padrn (<=0 para terminar): 50
Ingresa un padrn (<=0 para terminar): 0
Esta es la lista de inscritos: [30, 40, 50]
>>>
Inscripcin en el curso 04 de 75.40
Ingresa un padron (<=0 para terminar): 0
Esta es la lista de inscritos: []
>>>
Inscripcin en el curso 04 de 75.40
Ingresa un padron (<=0 para terminar): 30
Ingresa un padron (<=0 para terminar): 40
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Ingresa un padron (<=0 para terminar): 40
Ingresa un padron (<=0 para terminar): 30
Ingresa un padron (<=0 para terminar): 50
Ingresa un padron (<=0 para terminar): 0
Esta es la lista de inscritos: [30, 40, 40, 30, 50]

Evidentemente el programa funciona de acuerdo a lo especificado, pero hay algo que no


tuvimos en cuenta: permite inscribir a una misma persona ms de una vez.

6. Mantenimiento: No permitir que haya padrones repetidos.

7. Diseo revisado: Para no permitir que haya padrones repetidos debemos revisar que
no exista el padrn antes de agregarlo en la lista:

La lista de inscritos es vaca.

Pedir padrn.

Mientras el padrn sea positivo:


Si el padrn no est en la lista, agregar el padrn a la lista.

Pero si est en la lista, avisar que el padrn ya est en la lista.

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Pedir padrn.

8. Nueva implementacin: De acuerdo a lo diseado en el prrafo anterior, el


programa ahora quedara como se muestra en el cdigo 7.2.

9. Nueva prueba: Para probarlo lo ejecutamos con los mismos lotes de prueba
anteriores (inscripcin de tres alumnos, inscripcin de cero alumnos, inscripcin de
alumnos repetidos):

Inscripcin en el curso 04 de 75.40


Ingresa un padrn (<=0 para terminar): 30
Ingresa un padrn (<=0 para terminar): 40
Ingresa un padrn (<=0 para terminar): 50
Ingresa un padrn (<=0 para terminar): 0
Esta es la lista de inscritos: [30, 40, 50]
>>>
Inscripcin en el curso 04 de 75.40
Ingresa un padrn (<=0 para terminar): 0

#inscritos.py: Permite ingresar padrones, sin repetir

#!/usr/bin/env python

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
# encoding: latin1
""" Mdulo para inscribir alumnos al curso - versin 1 """

# Iniciamos la interaccin con el usuario


print "Inscripcion en el curso 04 de 75.40"

# Leemos el primer padrn


padron=input("Ingresa un padrn (<=0 para terminar): ")

# Procesamos los padrones


# Inicialmente no hay inscritos
ins = []
while padron > 0:
# Si todava no est, agregamos el padrn a la lista de inscritos,
if padron not in ins:
ins.append(padron)
# de lo contrario avisamos que ya figura
else:
print "Ya figura en la lista"

# Leemos otro padrn mas


open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
padron=input("Ingres un padrn (<=0 para terminar): ")

# Mostramos el resultado
print "Esta es la lista de inscritos: ", ins

Esta es la lista de inscriptos: []


>>>
Inscripcin en el curso 04 de 75.40
Ingresa un padrn (<=0 para terminar): 30
Ingresa un padrn (<=0 para terminar): 40
Ingresa un padrn (<=0 para terminar): 40
Ya figura en la lista
Ingresa un padrn (<=0 para terminar): 30
Ya figura en la lista
Ingresa un padrn (<=0 para terminar): 50
Ingresa un padrn (<=0 para terminar): 0
Esta es la lista de inscriptos: [30, 40, 50]

Pero ahora el resultado es satisfactorio: no tenemos inscritos repetidos.

Ejercicio 7.7. Permitir que los alumnos se puedan inscribir o borrar.

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
Ejercicio 7.8. Inscribir y borrar alumnos como antes, pero registrar tambin el nombre y
apellido de la persona inscripta, de modo de tener como lista de inscritos: [(20,
"Ana", "Garca"), (10, "Juan", "Salas")] .

Anterior Siguiente
7.1. Tuplas 7.3. Ordenar listas

Copyright (c) 2011-2014 Rosita Wachenchauzer, Margarita Manterola, Maximiliano Curia, Marcos Medrano,
Nicols Paez. La copia y redistribucin de esta pgina se permite bajo los trminos de la licencia Creative
Commons Atribucin - Compartir Obras Derivadas Igual 3.0 siempre que se conserve esta nota de copyright.

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
INDICE DE CONTENIDOS

1. Algunos conceptos bsicos

2. Programas sencillos

3. Funciones

4. Decisiones

5. Ms sobre ciclos

6. Cadenas de caracteres

Captulo 7. Tuplas y listas

7.1. Tuplas

7.2. Listas

7.3. Ordenar listas

7.4. Listas y cadenas

7.5. Resumen

7.6. Ejercicios

8. Algoritmos de bsqueda

9. Diccionarios

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
10. Contratos y Mutabilidad

11. Manejo de archivos

12. Manejo de errores y excepciones

13. Procesamiento de archivos

14. Objetos

15. Polimorfismo, Herencia y Delegacin

16. Listas enlazadas

17. Pilas y colas

18. Modelo de ejecucin de funciones y recursividad

19. Ordenar listas

20. Algunos ordenamientos recursivos

3.757
2006-2017 LibrosWeb.es Contacto Novedades Condiciones Privacidad

das online

open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com
open in browser PRO version Are you a developer? Try out the HTML to PDF API pdfcrowd.com