Estructuras de Datos en Python
Estructuras de Datos en Python
dot
ÍNDICE
1
ESTRUCTURAS DE DATOS EN PYTHON
¿Sabrías decir con unas pocas palabras lo que son este tipo de estructuras? No
te preocupes si ahora mismo no sabes describirlo con exactitud. Al finalizar esta
unidad, comprenderás perfectamente su uso y los diferentes tipos que existen,
así como las propiedades de cada una.
Vamos a ello…
3
ESTRUCTURAS DE DATOS EN PYTHON
1. ESTRUCTURAS DE DATOS
Python incorpora varios tipos compuestos de datos de forma nativa. Podemos
ver un tipo compuesto como una estructura de datos que nos permite almace-
nar una colección de elementos o valores. Si has trabajado con otros lenguajes,
un ejemplo sencillo sería un vector o array de elementos. Python nos ofrece
más alternativas, con características diferentes dependiendo de cómo se alma-
cenan los valores dentro de la estructura y de qué operaciones podemos hacer.
Aunque podríamos englobar también a las cadenas (str y unicode) y los conjun-
tos (set y frozenset) o los constructores dentro de esta categorización, en esta
unidad vamos a ver las tres estructuras de datos principales de Python:
Tuplas.
Listas.
Resumiendo, y para comenzar con la unidad, las forma de acceder a estas es-
tructuras de control (independientemente del tipo que sean) son:
5
ESTRUCTURAS DE DATOS EN PYTHON
Las estructuras de datos en Python podríamos dividirlas en dos grupos, las se-
cuenciales (formadas por secuencias de datos ordenados) y los conjuntos de
datos, que no son ordenados. A su vez, también podemos dividirlos por estruc-
turas de datos mutables e inmutables, como vimos en la unidad de iniciación.
Vamos a profundizar un poco más en todos estos términos.
1.1. SECUENCIAS
Empezaremos por las estructuras de tipo secuencial. Son tipos de datos com-
puestos por una serie de elementos, preservando el orden o posición en el que
se añaden a la estructura. Por este motivo, se dice que son tipos ordenados.
1.1.1. LISTAS
La forma común de definir una lista es incluyendo los elementos separados por
comas entre un par de corchetes.
6
ESTRUCTURAS DE DATOS EN PYTHON
Ejemplos de listas
Si te has fijado, la última lista de ejemplo tiene listas anidadas como elementos.
¿Cuantos elementos dirías que tiene la lista de nivel superior? ¿Serías capaz de
identificarlos? Podemos usar lo que hemos aprendido de bucles para compro-
barlo…
print(elemento)
Aqui hay
['listas', 'anidadas']
[1, 2]
Para acceder a los elementos de una lista por su índice o posición, ponemos el
índice entre corchetes también.
7
ESTRUCTURAS DE DATOS EN PYTHON
Si queremos obtener la longitud de una lista (el número de elementos que con-
tiene), tan solo debemos hacer uso de la función len().
# Longitud de la lista
len(lista_nums)
# Resultado: 6
len(listas_anidadas)
# Resultado: 3
# Seleccionar un elemento
# Resultado: 1
# Resultado: 4
# Resultado: 4
8
ESTRUCTURAS DE DATOS EN PYTHON
# Resultado: 4
# Resultado: 1
Para que comprendas mejor cómo funcionan los índices para acceder a un
elemento, imagina que tenemos la lista [ 'A', 'B', 'C', 'D', 'E', 'F' ].
La siguiente figura muestra a qué posición referencia un índice positivo o un
índice negativo.
En lugar de ver los índices "apuntando" a cada elemento, pensemos que los índi-
ces marcan las posiciones entre elementos de la secuencia. En este caso, el índice
6 referencia una posición fuera de los límites de la lista y produciría un error.
Ahora es más fácil ver cómo podemos seleccionar un "slice" de elementos conti-
guos de una lista. Indicamos el índice o posición inicial desde donde empeza-
mos la selección y la posición final hasta donde queremos llegar, escribiéndolos
dentro de los corchetes separados por dos puntos (:). En las slices, el elemento
correspondiente al límite inicial siempre se incluye, pero el elemento en el límite
final queda excluido.
9
ESTRUCTURAS DE DATOS EN PYTHON
letras = ['A','B','C','D','E','F']
letras[0:2]
letras[2:5]
letras[2:]
letras[:4]
letras[‐2:]
letras[:‐2]
letras[:2] + letras[2:]
10
ESTRUCTURAS DE DATOS EN PYTHON
print(lista_lenguajes)
lista_lenguajes[0] = "java"
print(lista_lenguajes)
print(lista_lenguajes)
lista_lenguajes[1:3] = []
print(lista_lenguajes)
['java', 'brainfuck']
# o vaciarla entera
lista_lenguajes[:] = []
print(lista_lenguajes)
[]
11
ESTRUCTURAS DE DATOS EN PYTHON
# concatenación
lista_1 + lista_2
3 * lista_1
x, y, z = lista_2
print(x)
print(y)
print(z)
# Resultado:
100
200
300
12
ESTRUCTURAS DE DATOS EN PYTHON
Luego tenemos una orden que nos permite eliminar un valor concreto dentro
de una lista:
Esta es diferente del método .pop(), el cual devuelve un valor. La instrucción del
también puede usarse para quitar secciones de una lista o vaciar la lista completa.
del a[0]
del a[2:4]
del a[:]
# Resultado: []
13
ESTRUCTURAS DE DATOS EN PYTHON
lista_1.append('d')
print(lista_1)
ultimo_valor = lista_1.pop()
print(ultimo_valor)
print(lista_1)
# Resultado: d
lista_1.insert(0, 'e')
lista_1.insert(2, 'c')
print(lista_1)
14
ESTRUCTURAS DE DATOS EN PYTHON
lista_1.index('b')
# Resultado: 3
lista_1.count('c')
# Resultado: 2
lista_1.remove('c')
print(lista_1)
lista_1.sort()
print(lista_1)
lista_1.reverse()
print(lista_1)
del lista_1[2]
print(lista_1)
lista_1.clear()
print(lista_1)
# Resultado: []
15
ESTRUCTURAS DE DATOS EN PYTHON
Antes de continuar, vamos a aprovechar para explicar un detalle más sobre las
variables, su contenido y lo que ocurre al hacer asignaciones en Python.
lista1 = [1, 2, 3]
lista2 = lista1
print(lista2)
# Resultado: [1, 2, 3]
lista1 == lista2
# Resultado: True
Ambas son dos nombres o referencias al mismo dato, a la misma lista, y no dos
copias distintas con los mismos valores (¿alguien se acuerda de los punteros en C++?).
16
ESTRUCTURAS DE DATOS EN PYTHON
# Resultado: True
# Modificamos lista2
lista2[1] = 99
print(lista1)
lista2 = [7, 8, 9]
17
ESTRUCTURAS DE DATOS EN PYTHON
A la hora de trabajar con estructuras de datos mutables (como las listas), debe-
rás tener todo esto en cuenta para evitar modificar accidentalmente el conteni-
do de una variable al manipular una segunda.
Si necesitas una copia idéntica pero independiente de una lista, puedes usar el
método copy().
lista1 = [1, 2, 3]
lista2 = lista1.copy()
Como ves, dispones de una amplia cantidad de métodos para hacerte la vida
más sencilla la hora de trabajar con listas. Vamos a pasar a la siguiente estructu-
ra de datos, que también te encantará, pero de otra forma.
18
ESTRUCTURAS DE DATOS EN PYTHON
1.1.2. TUPLAS
Las tuplas son un tipo de datos similar a las listas. Como ellas, las tuplas están
formadas por una secuencia de elementos ordenados. Las diferencias princi-
pales son dos:
¿Qué queremos decir con inmutables? Pues que una vez que has creado una tu-
pla definiendo sus elementos, ya no puedes modificar los valores que contiene.
Vamos a ver un ejemplo de tupla para que comprendas mejor esta estructura
de datos.
#!/usr/bin/python
print(mano)
print(mano[0])
19
ESTRUCTURAS DE DATOS EN PYTHON
print(mano[1])
print(jugador)
En realidad, Python nos permite definir una tupla sin usar los paréntesis al
crearla. Es decir, poniendo simplemente los elementos separados por comas.
Además, hay dos casos especiales de creación de tuplas: la tupla vacía y la tupla
de un solo elemento. Las tuplas vacías se crean con una pareja de paréntesis
vacía, sin ningún elemento dentro.
20
ESTRUCTURAS DE DATOS EN PYTHON
Para crear una tupla con un único elemento, lo rodeamos entre paréntesis, pe-
ro es necesario añadir una coma justo detrás del elemento y antes del cierre de
paréntesis. Parece raro, pero como los paréntesis también sirven para "encapsu-
lar" una expresión (p.ej. (3 * 4)), Python necesita una pista para distinguir si
queremos construir una tupla con un solo valor o no.
elemento
tupla_vacia = ()
print(tupla_vacia)
# Resultado: ()
tupla_un_elemento = (1,)
print(tupla_un_elemento)
# Resultado: (1,)
tupla = ("hola", 20, [1, 2, 3]) # tupla heterogénea (varios tipos de datos).
21
ESTRUCTURAS DE DATOS EN PYTHON
Sabes por donde voy, ¿verdad? Efectivamente, las cadenas de caracteres son
otro tipo de secuencia en Python (como ya te advertimos entonces). Unas
secuencias con la particularidad de que sólo se componen de caracteres de
texto, y que, a la hora de representarlas, se utiliza una notación más compacta y
sencilla para los humanos, escribiendo simplemente el texto entre comillas.
Además, son inmutables (como las tuplas) y llevan añadidas una serie de fun-
ciones o métodos especiales solo para su uso con cadenas.
Ya has aprendido que en Python tenemos los tipos lista, tupla y cadena de texto,
y que son tipos secuenciales, es decir, son colecciones ordenadas de elementos.
Bueno, dejemos ahora las secuencias. En Python tenemos también tipos com-
puestos de datos que no son ordenados. Es decir, que sus elementos no con-
servan el orden en el que son colocados.
22
ESTRUCTURAS DE DATOS EN PYTHON
Para crear un conjunto escribimos los elementos entre un par de llaves y sepa-
rados por comas. Si queremos crear un conjunto vacío utilizaremos la función
set(), y no un par de llaves vacías ({}) como podrías pensar. Un poco más ade-
lante te mostraremos que un par de llaves vacías crean un diccionario vacío.
Vamos a ver un pequeño ejemplo campista, que seguro que te deja las cosas
mucho más claras con los datasets:
#!/usr/bin/python
en_mochila = set()
print(en_mochila)
en_mochila.add("cuchillo")
print(en_mochila)
# usamos 'in'
23
ESTRUCTURAS DE DATOS EN PYTHON
en_mochila.discard("cuerda")
print(en_mochila)
a = {1, 2, 3, 5, 8}
b = {1, 2, 4, 8, 16}
# unión de a y b
a.union(b)
a | b
# intersección de a y b
a.intersection(b)
# Resultado: {1, 2, 8}
a & b
# Resultado: {1, 2, 8}
# diferencia entre a y b
a.difference(b)
# Resultado: {3, 5}
24
ESTRUCTURAS DE DATOS EN PYTHON
a ‐ b
# Resultado: {3, 5}
a.symmetric_difference(b)
a ^ b
s = {1, 2}
# ¿s es un subconjunto de a?
s.issubset(a)
# Resultado: True
s <= a
# Resultado: True
# ¿a es un superconjunto de s?
a.issuperset(s)
# Resultado: True
a >= s
# Resultado: True
25
ESTRUCTURAS DE DATOS EN PYTHON
Como puedes observar, la cantidad de acciones que podemos realizar a los da-
taset es brutal, lo que los posiciona como una forma genial de realizar labores
matemáticas con conjuntos de datos.
1.3. DICCIONARIOS
Otro tipo de dato útil incluido en Python de forma nativa es el diccionario. Los
diccionarios se encuentran a veces en otros lenguajes como “memorias asocia-
tivas” o “arreglos asociativos”. A diferencia de las secuencias, que se indexan
mediante un rango numérico, los diccionarios se indexan con claves, que pue-
den ser cualquier tipo inmutable; las cadenas y números siempre pueden ser
claves. Las tuplas pueden usarse como claves si solamente contienen cadenas,
números o tuplas; si una tupla contiene cualquier objeto mutable directa o indi-
rectamente, no puede usarse como clave. No puedes usar listas como claves,
ya que las listas pueden modificarse usando asignación por índice, asignación
por sección, o métodos como append() y extend(). Resumiendo, una clave
tiene que estar formada por un elemento inmutable, no puede cambiar una
vez que se ha añadido junto con su valor al diccionario.
26
ESTRUCTURAS DE DATOS EN PYTHON
También es posible borrar un par clave:valor con del. Si usas una clave que ya
está en uso para guardar un valor, el valor que estaba asociado con esa clave se
pierde. Extraer un valor usando una clave no existente nos arrojará un bonito
mensaje de error, como es lógico.
extension['guido'] = 4127
print(extension)
extension['juan']
# Resultado: 4098
del extension['pedro']
extension['ivan'] = 4127
print(extension)
print(extension.keys())
print('guido' in extension)
# Resultado: True
27
ESTRUCTURAS DE DATOS EN PYTHON
# Carlos = 5556033
# Javier = 5556051
# Daniel = 5556056
# Carlos = 5556033
# Javier = 5556051
# Daniel = 5556056
print(telefono) # Resultado:
# 5556033
# 5556051
# 5556056
28
ESTRUCTURAS DE DATOS EN PYTHON
Puedes seguir investigando por tu cuenta más usos de los diccionarios, como
almacén de información, por ejemplo… ¿Te recuerdan a la semántica del lengua-
je JSON?
Ahora que ya hemos visto los principales tipos compuestos de datos que ofrece
Python de forma nativa, vamos a presentarte un tipo de expresiones muy útiles
y potentes para crear y trabajar con estas estructuras de datos.
Las definiciones por comprensión son una forma muy concisa y simple de gene-
rar colecciones de datos de forma automática. Se utilizan sobre todo con listas,
pero son aplicables a todos los tipos compuestos haciendo los debidos ajustes.
Las definiciones por comprensión son expresiones que permiten construir una
nueva colección definiéndola a partir de otra colección de partida, una expre-
sión generadora de los nuevos elementos a incluir y un predicado o condición.
29
ESTRUCTURAS DE DATOS EN PYTHON
Escrito así, a lo mejor te parece complejo, pero verás que es muy sencillo. Lo
mejor será comenzar con un caso de ejemplo. Imagina que queremos guardar
en una lista la tabla de multiplicar del 7. Una forma de hacerlo con lo que has
aprendido hasta ahora sería mediante un bucle.
tabla_del_7 = []
tabla_del_7.append(7 * x)
print(tabla_del_7)
# Resultado: [0, 7, 14, 21, 28, 35, 42, 49, 56, 63]
Hemos tenido que crear una variable con una lista vacía al principio, y después
utilizar un bucle for para iterar por los valores de 0 a 9 e ir modificando en cada
paso la lista, para añadir cada valor de la tabla de multiplicar.
No es que sea un código muy complicado ni largo. Pero Python nos permite
hacer esto de forma más sencilla y breve.
print(tabla_del_7)
30
ESTRUCTURAS DE DATOS EN PYTHON
También podemos combinar dos o más cláusulas for con sus dominios de en-
trada para construir la colección.
# Resultado:
[(1, 4, 4),
(1, 5, 5),
(1, 6, 6),
(2, 4, 8),
(2, 5, 10),
(2, 6, 12),
(3, 4, 12),
(3, 5, 15),
(3, 6, 18)]
31
ESTRUCTURAS DE DATOS EN PYTHON
En este caso hemos hecho que la expresión generadora devuelva una tupla con
los valores de x, y y de x * y. Puede utilizarse cualquier expresión, todo lo
compleja que se necesite, siempre que devuelva un elemento válido.
{ x for x in range(10) if x % 2 != 0 }
# Resultado: {1, 3, 5, 7, 9}
# Resultado: (0, 1, 2, 3, 4)
print(dict_tabla_7[3])
# Resultado: 21
32
ESTRUCTURAS DE DATOS EN PYTHON
1.5. GENERADORES
Un par de párrafos más arriba acabamos de ver que si queremos crear una tu-
pla definida por comprensión no basta con reemplazar los corchetes por parén-
tesis, tenemos que usar el constructor tuple().
print(gen_tabla_7)
33
ESTRUCTURAS DE DATOS EN PYTHON
for v in gen_tabla_7:
print(v)
14
21
28
35
42
49
56
63
34
ESTRUCTURAS DE DATOS EN PYTHON
# si tenemos un generador
lista_tabla_3 = list(gen_tabla_3)
print(lista_tabla_3)
otra_lista_tabla_3 = list(gen_tabla_3)
print(otra_lista_tabla_3)
# Resultado: []
Aprovecha todo lo que los generadores te ofrecen para ampliar tus skills como
programador de Python.
35
ESTRUCTURAS DE DATOS EN PYTHON
Tuplas.
Listas.
Diccionarios.
Cada una de estas estructuras tienen unas características propias. Por ejemplo,
las tuplas son inmutables, las listas pueden ser modificadas con sus propios mé-
todos y los diccionarios disponen de una estructura clave:valor que nos ofre-
ce muchas posibilidades.
Practica con los ejercicios que te proponemos y los ejemplos de la unidad para
comprender perfectamente su funcionamiento.
37
ESTRUCTURAS DE DATOS EN PYTHON
BIBLIOGRAFÍA
39