Operaciones con listas¶
Las listas son un mecanismo muy poderoso. Veamos algunas operaciones que podemos realizar con ellas.
Borrar elementos¶
La sentencia del permite borrar un elemento de la lista indicando su índice:
>>> alumnos = [ 'Ana', 'Juan', 'Andrés']
>>> del alumnos[1]
>>> alumnos
['Ana', 'Andrés']
Concatenar listas¶
Como sucede con las cadenas de texto, el operador + concatena dos listas para
obtener una nueva más grande:
>>> amigos = [ 'Ana', 'Juan', 'Andrés']
>>> familia = [ 'Victor', 'Luisa', 'Cristina']
>>> invitados = familia + amigos
>>> print(invitados)
['Victor', 'Luisa', 'Cristina', 'Ana', 'Juan', 'Andrés']
Nótese que se respeta el orden de los elementos.
Supongamos que no queremos crear una nueva lista, sino incorporar los elementos de la segunda lista a la primera. En principio, basta con asignar la nueva lista a la variable inicial, perdiendo la lista original:
>>> personas = [ 'Ana', 'Juan', 'Andrés']
>>> vecinos = [ 'Victor', 'Luisa', 'Cristina']
>>> personas = personas + vecinos
>>> print(personas)
['Victor', 'Luisa', 'Cristina', 'Ana', 'Juan', 'Andrés']
Pero hay una alternativa. El método extend() toma una colección de cualquier
tipo y añade sus elementos a la lista asociada, sin crear una nueva:
>>> personas = [ 'Ana', 'Juan', 'Andrés']
>>> vecinos = [ 'Victor', 'Luisa', 'Cristina']
>>> personas.extend(vecinos)
>>> personas
['Ana', 'Juan', 'Andrés', 'Victor', 'Luisa', 'Cristina']
Slicing¶
Al igual que sucede con las cadenas de texto, podemos obtener una nueva lista extrayendo una porción de la lista original:
>>> amigos = [ 'Ana', 'Juan', 'Andrés', 'Victor', 'Luisa', 'Cristina']
>>> amigos[1:4]
['Juan', 'Andrés', 'Victor']
El mecanismo de doble índice es similar al de los string, y en general, al de cualquier colección.
¿Esta un elemento en la lista?¶
Podemos examinar una lista mediante:
>>> amigos = [ 'Ana', 'Juan', 'Andrés']
>>> elemento = 'Juan'
>>> encontrado = False
>>> n = 0
>>> limite = len(amigos)
>>> while n < limite:
... if amigos[n] == elemento:
... encontrado = True
... break
... else:
... n += 1
...
>>> encontrado
True
Bien, esto es un poco complejo. Hay un operador que nos puede simplificar la vida:
>>> amigos = [ 'Ana', 'Juan', 'Andrés']
>>> 'Juan' in amigos
True
El operador in tiene dos operandos, a la izquierda, el elemento a buscar,
y a la derecha, la lista donde buscar:
elemento = `Juan`
if elemento in lista:
cosas a hacer...
Obtener posición de un elemento¶
El método index devuelve la posición del elemento pasado como argumento:
>>> amigos = [ 'Ana', 'Juan', 'Andrés']
>>> amigos.index('Juan')
1
De todas formas, plantea un problema. Genera un error si el elemento no existe en la lista:
>>> amigos.index('Pedro')
Traceback (most recent call last):
File "/usr/lib/python3.13/idlelib/run.py", line 590, in runcode
exec(code, self.locals)
~~~~^^^^^^^^^^^^^^^^^^^
File "<pyshell#9>", line 1, in <module>
ValueError: 'Pedro' is not in list
Lo que nos obliga a hacer una comprobación previa:
>>> if 'Juan' in amigos:
... amigos.index('Juan')
...
1
Obtener un elemento al azar¶
La biblioteca random proporciona funciones para trabajar con listas.
La función choice() devuelve un elemento de la lista tomado al azar:
| Sorteo.py | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Lo que muestra algo así como:
Ana
Victor
Pero este es un sorteo extraño, ya que una persona puede recibir varios premios. Vamos a eliminar de la lista a quienes ya hayan sido agraciados:
| Sorteo2.py | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Lo que muestra algo así como:
Resultado del sorteo:
1: Cristina
2: Andrés
3: Victor
Borrar un elemento a partir de su valor¶
En el ejemplo, vemos que el método remove() suprime de la lista el elemento
que le pasemos como argumento. Es una alternativa a la sentencia del que
borra elementos a partir de su número índice.
Pero ¡Ojo! Si no existe ese valor en la lista, obtendremos un error:
>>> participes = [ 'Ana', 'Juan', 'Andrés', 'Victor', 'Luisa', 'Cristina']
>>> participes.remove('Sergio')
Traceback (most recent call last):
File "/usr/lib/python3.13/idlelib/run.py", line 590, in runcode
exec(code, self.locals)
~~~~^^^^^^^^^^^^^^^^^^^
File "<pyshell#51>", line 1, in <module>
ValueError: list.remove(x): x not in list
... lo que, a veces, nos obligará a hacer una comprobación:
if 'Sergio' in participes:
participes.remove('Sergio')
o bien:
try:
participes.remove('Sergio')
except:
pass
Ordenar los elementos de una lista¶
Una vez creadas, los elementos de una lista mantienen el orden en que son incorporados a la lista:
>>> personas = [ 'Ana', 'Juan', 'Andrés', 'Victor', 'Luisa', 'Cristina']
>>> personas
['Ana', 'Juan', 'Andrés', 'Victor', 'Luisa', 'Cristina']
Podemos ordenar los elementos con el método sort()
>>> personas.sort()
>>> personas
['Ana', 'Andrés', 'Cristina', 'Juan', 'Luisa', 'Victor']
El método sort() no genera una nueva lista, sino que se beneficia del hecho de
que las listas son objetos mutables.
¿Que hacer si queremos mantener la lista original y generar una nueva ordenada?
Usar la función sorted():
>>> personas = [ 'Ana', 'Juan', 'Andrés', 'Victor', 'Luisa', 'Cristina']
>>> personas2 = sorted(personas)
>>> personas
['Ana', 'Juan', 'Andrés', 'Victor', 'Luisa', 'Cristina']
>>> personas2
['Ana', 'Andrés', 'Cristina', 'Juan', 'Luisa', 'Victor']
La función sorted() no está ligada a un tipo de dato especial. Toma cualquier colección y genera una lista ordenada.
Desordenar una lista¶
Supongamos que estamos creando un juego. Tenemos una lista de personas y queremos ordenarlas al azar:
>>> import random
>>> personas = [ 'Ana', 'Juan', 'Andrés', 'Victor', 'Luisa', 'Cristina']
>>> random.shuffle(personas)
>>> personas
['Victor', 'Juan', 'Ana', 'Luisa', 'Cristina', 'Andrés']