Tema 5: Llistes

Objectius i argument

Continuant amb el bloc sobre els elements més bàsics d'emmagatzemat d'informació, aquest tema es dedica a les llistes. Les llistes són l'estructura de dades lineal per excel·lència i a Python són un tipus de dades nadiu. Com a complement, s'usen les llistes per introduïr el concepte fonamentals de tipus mutable.

Resultats d'aprenentatge

En haver assolit el tema una estudianta ha de poder:

  • Representar conceptes sobre estructures de llista, com a molt amb llistes de llistes.
  • Manipular les llistes fent us de les operacions addients
  • Emprar el iterador per operar sobre llistes
  • Entendre el concepte de mutabilitat i les conseqüències: sobre el pas de paràmetres i sobre els àlies. Saber dissenyar funcions pures i accions.
  • Saber dissenyar petits programes en que interaccionin llistes i strings.

Conceptes clau

Llistes i tipus llista. Llistes de llistes. Llistes homogènies i heterogènies. Operacions d'accés als elements d'una llista. Operacions sobre llistes: longitud, pertanyença, concatenació, repetició. Llesques o intèrvals en llistes. El constructor "range". Mutabilitat: el cas de les llistes. Esborrat en llistes. Objectes, valors i aliasing. Clonació. L'iterador de llistes. Mutabilitat i paràmetres: els cas de les llistes. Funcions pures i efecte lateral. Matrius. Relació entre tipus i strings.

Referència principal

  • How to Think Like a Computer Scientist: Learning with Python 2nd Edition: (capítol 9). Teniu una traducció preliminar a la carpeta d'apunts.

Referències complementàries

  • El capítol sobre llistes de Dive into Python conté més informació sobre el que ja s'ha vist i algun concepte nou.
  • El llibre sobre python de wikibooks també conté un capítol sobre llistes especialment resumit.
  • La documentació oficial de Python pel que fa al mòdul de llistes és d'aplicació directe a aquest capítol.

Exercicis obligatoris de teoria

Recordeu que per resoldre els següents exercicis, totes les funcions han d'estar correctament documentades amb els doctests.

EOT 5.1

Dissenyeu un programa que llegeixi 10 nombres enters i els emmagatzemi en una llista. El programa ha d'assegurar que tots els nombres introduïts per l'usuari són positius. Quan un nombre sigui negatiu, el programa ho indicarà amb un missatge i demanarà a l'usuari introduir un nou nombre quantes vegades sigui necessari.

EOT 5.2

Dissenyeu un programa que llegeixi un enter n i escrigui el quadrat dels nombres enters entre 1 i n. Seguiu els següents passos:

  1. Definiu la funció construeix_llista que, donat n, retorna la llista dels enters de 1 a n. (Pista: estudieu la funció "range").
  2. Definiu la funció modifica_llista que té com a paràmetre una llista d'enters i retorna una llista amb els quadrats de la primera.
  3. Definiu la funció escriure_llista, que escriu de manera agradable una llista d'enters.
  4. Finalment, usant les tres funcions anteriors, escriu el programa que es demana.

EOT 5.3

Dissenyeu una funció que elimini d'una llista tots els elements amb índex parell.

EOT 5.4

Dissenyeu una funció tal que, donada una llista de reals en calculi la mitjana.

EOT 5.5

Dissenyeu una funció tal que, donada una llista de punts al pla, calculi quants d'aquests punts són dins del cercle de radi 1 centrat a l'orígen. Assumiu que la llista té una estructura com la següent:

[[x0,y0], [x1,y1], [x2,y2],....]

EOT 5.6

Dissenyeu la funció llegeix_matriu(m,n) que gestioni la lectura d'una matriu de m files i n columnes. Deseu la funció en el mòdul "matrius.py".

Dissenyeu la funció matriu_multiplica_nombre(a,k) que donada una matriu a de m files i n columnes la multipliqui pel nombre k (El resultat de multiplicar una matriu per un nombre consisteix a multiplicar cada element de la matriu per aquest nombre). Deseu la funció en el mòdul "matrius.py"

Afegiu al mòdul "matrius.py" els doctests de les funcions anteriors.

EOT 5.7

Dissenyeu un programa que permeti determinar si una matriu és prima o no. Una matriu A és prima si la suma dels elements de qualsevol de les seves files és igual a la suma dels elements de qualsevol de les seves columnes. Utilitzeu la funció llegeix_matriu del mòdul "matrius.py" i dissenyeu una nova funció matriu_prima(m), que determini si la matriu m és prima. Finalment creeu el programa anomenat "provaMatriuPrima.py" que permeti obtenir la funcionalitat demanada.

EOT 5.8

Dissenyeu un programa que llegeixi dues matrius i calculi la diferència entre la primera i la segona. Utilitzeu la funció llegeix_matriu del mòdul "matrius.py". Dissenyeu una nova funció matriu_diferencia(a,b), que calculi la diferencia entre la matriu a i la matriu b. Finalment creeu el programa "provaDiferenciaMatrius.py" que permeti obtenir la funcionalitat demanada.

Exercicis obligatoris de laboratori

EOL 5.1

L'objectiu d'aquest exercici és dissenyar i implementar un programa que permeti analitzar mostres estadístiques. A tal efecte seguirem els següents passos:

  1. Dissenyeu i implementeu una funció que llegeixi del teclat una seqüència de reals i retorna la llista corresponent. Assumiu que els valors són sempre positius o zero i que el primer negatiu que es llegeix actúa de sentinella.
  2. Dissenyeu i implementeu una funció tal que donada una llista de reals de mida arbitraria en calcula la suma. Documenteu la funció i afegiu els doctests convenients. Comproveu amb nosetest que es comporta com cal.
  3. Dissenyeu i implementeu una funció tal que donada una llista de reals de mida arbitrària en calcula el màxim. Documenteu la funció i afegiu els doctests convenients. Comproveu amb nosetest que es comporta com cal.
  4. Dissenyeu i implementeu una funció tal que donada una llista de reals de mida arbitrària en calcula el mínim. Documenteu la funció i afegiu els doctests convenients. Comproveu amb nosetest que es comporta com cal.
  5. Dissenyeu i implementeu una funció tal que donada una llista de reals de mida arbitrària en calcula el recorregut. Documenteu la funció i afegiu els doctests convenients. Comproveu amb nosetest que es comporta com cal.
  6. Dissenyeu i implementeu una funció tal que donada una llista de reals de mida arbitrària en calcula la mitja. Documenteu la funció i afegiu els doctests convenients. Comproveu amb nosetest que es comporta com cal.
  7. Dissenyeu i implementeu una funció tal que donada una llista de reals de mida arbitrària en calcula la variància. Documenteu la funció i afegiu els doctests convenients. Comproveu amb nosetest que es comporta com cal.
A continuació, escriviu un programa que presenti un menú a l'usuari i li permeti executar les següents opcions:
  • Llegir dades
  • Calcular el recorregut
  • Calcular la mitja
  • Calcular la variància
Haureu construit el vostre propi calculador estadístic! Com ampliació us proposem que afegiu al calculador les funcionalitats de calcular la moda i la mediana.

Exercicis optatius

EOP 5.1

Dissenyeu un programa que llegeixi paraules fins a la paraula 'fi' i després les mostri ordenades alfabeticament.

EOP 5.2

Quina serà la sortida del següent programa :

this = ['Jo', 'soc', 'una', 'llista']
that = ['Jo', 'soc', 'una', 'llista']
print "Test 1: %s" % (id(this) == id(that))
that = this
print "Test 2: %s" % (id(this) == id(that))

EOP 5.3

Feu una funció que substitueixi una lletra per una altra en una cadena usant les funcions string.split i string.join. Tot seguit teniu la capçalera de la funció i el doctest corresponent:

def replace(s, old, new):
"""
>>> replace('Manresa', 'a', '4')
'M4nres4'
>>> s = 'M\'agrada molt ballar!'
>>> replace(s, 'ba', 'ca')
'M'agrada molt cantar!'
>>> replace(s, 'cantar', 'saltar')
'M'agrada molt saltar!'
"""

EOP 5.4

Feu una funció que indiqui quina posició ocupa una lletra en una paraula sense usar la funció string.find

EOP 5.5

Feu un programa que permetri entrar paraules fins a la paraula 'fi', un cop finalitzada l'entrada de dades ha d'indicar si hi ha alguna paraula repetida.