Tema 6: Listas

Compartir en:
Haz clic aquí para ver la videoclase

Contenidos

Referencia principal: Capítulo 8 de Severance, C. R. (2016). Python for everybody: Exploring data using Python 3. Ann Arbor, MI: Charles Severance.

Listas

Las listas son secuencias de valores. En algunos aspectos se parecen a las cadenas, que también son secuencias, pero de caracteres. En el caso de las listas, los valores pueden presentarse en cualquier forma: cadenas, enteros, incluso otras listas... Las listas se delimitan entre corchetes. Observa las siguientes listas:

1# Severance (2016)
2
3[10, 20, 30, 40]
4
5['crunchy frog', 'ram bladder', 'lark vomit']
6
7['spam', 2.0, 5, [10, 20]]


La mayoría de operaciones que vimos en las cadenas se pueden aplicar también a las listas. Podemos acceder a sus componentes con índices, calcular su longitud con la función len(), hacer slicing con los corchetes y el operador :, comprobar contenidos con el operador in y recorrerlas mediante bucles:

 1miLista = ['crunchy frog', 'ram bladder', 'lark vomit']
 2
 3print(miLista[2])
 4
 5print(len(miLista))
 6
 7print(miLista[:1])
 8
 9print('ram bladder' in miLista)
10
11print('wonderwall' in miLista)
12
13
14
15for item in miLista:
16
17  print('He pasado por', item)
lark vomit
3
['crunchy frog']
True
False
He pasado por crunchy frog
He pasado por ram bladder
He pasado por lark vomit


Sin embargo, las listas son mutables. Podemos acceder a su interior y modificarlo. Observa cómo sustituyo aguacate por tomate.

1frutas = ['pera', 'aguacate', 'manzana']
2
3print(frutas)
4
5frutas[1] = 'tomate'
6
7print(frutas)
['pera', 'aguacate', 'manzana']
['pera', 'tomate', 'manzana']


Métodos de lista

Las listas pertenecen a un tipo de objeto diferente a las cadenas y, por ello, tienen unos algunos métodos únicos:

  • append(x): añadir el elemento x al final de la lista. Si pasamos otra lista, no se añadirán sus elementos sino la lista como objeto.

  • extend(x): este método toma como argumento (entre paréntesis) otra lista y añade sus elementos a la lista original.

  • sort(): ordena de menor a mayor o alfabéticamente los elementos de la lista.

  • remove(x): elimina el elemento x de la lista.

  • x.join(y): une en una cadena los elementos de la lista y separados por x.


 1frutas = ['pera', 'aguacate', 'manzana']
 2
 3print(frutas)
 4
 5frutas.append('tomate')
 6
 7print(frutas)
 8
 9frutas.append(['higo', 'breva'])
10
11print(frutas)
12
13frutas.remove(['higo', 'breva'])
14
15print(frutas)
16
17frutas.extend(['higo', 'breva'])
18
19print(frutas)
20
21frutas.sort()
22
23print(frutas)
24
25print(' | '.join(frutas))
['pera', 'aguacate', 'manzana']
['pera', 'aguacate', 'manzana', 'tomate']
['pera', 'aguacate', 'manzana', 'tomate', ['higo', 'breva']]
['pera', 'aguacate', 'manzana', 'tomate']
['pera', 'aguacate', 'manzana', 'tomate', 'higo', 'breva']
['aguacate', 'breva', 'higo', 'manzana', 'pera', 'tomate']
aguacate | breva | higo | manzana | pera | tomate


Depurando secuencias (cadenas y listas)

Como ya hemos visto en las dos unidades, las cadenas y las listas comparten la propiedad fundamental de ser secuencias. Es habitual acceder mediante los índices entre corchetes a los elementos que las componen y, en ocasiones, esto puede ocasionar errores en el código si la secuencia que manejamos no contiene lo que esperábamos.


Imaginemos que estamos recogiendo los nombres de nuestros participantes en un experimento y queremos comprobar que el nombre no incluya don o doña antes de su nombre:

1nombre = input('Nombre: ')
2
3if nombre[0] == 'd':
4
5  print('Incluye solo tu nombre, por favor.')
6
7else:
8
9  print('Gracias')
Nombre: 



---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-4-38ad5e7b2a60> in <module>()
      1 nombre = input('Nombre: ')
----> 2 if nombre[0] == 'd':
      3   print('Incluye solo tu nombre, por favor.')
      4 else:
      5   print('Gracias')


IndexError: string index out of range


Como ves, si el usuario no introduce nada en el campo, la cadena está vacía y, por lo tanto, a la hora de evaluar la expresión nombre[0], devuelve un fallo porque ese índice no existe. Siempre debemos utilizar una sintaxis que garantice el funcionamiento del código ante posibles contratiempos. En este caso, habría sido óptimo utilizar el método startswith('d.').


En el caso de las listas, en ocasiones necesitamos acceder sin alternativa a uno de los elementos de la lista con índices. En estos casos, es aconsejable comprobar que no estén vacías. Podemos utilizar la función len().

1nombre_completo = ['Mario', 'Casado', 'Mancebo']
2
3if len(nombre_completo) > 0 and nombre_completo[1]:
4
5  print('Mi primer apellido es', nombre_completo[1])
Mi primer apellido es Casado


Como ves, una vez que hemos comprobado que no es una cadena y, por tanto, tiene índices con len(), podemos evaluar si existe un índice en concreto simplemente colocándolo junto a un if. La expresión if nombre_completo[1] se interpreta 'si existe nombre_completo[1]'.