Está en la página 1de 16

8/10/23, 23:20 Copia de Listas.

ipynb - Colaboratory

Portada

César Alberto Solano Chávez

martes 26 de septiembre del 2023

Ingeniería en mecatrónica

ITESO, campus guadalajara

Algoritmos y programación

Datos estructurados — Listas

When you make the finding yourself —even if you're the last person on Earth to see the light— you'll never forget it.
—Carl Sagan

En general, podemos tener dos clases de tipos de datos:

Tipo de datos simples (o primitivos) y


Tipo de datos estructurados.

Los tipos de datos simples pueden contener un solo valor en un momento dado, en el momento en que se les asigna un nuevo valor, el valor
anterior se pierde.

velocidad = 25
velocidad

25

velocidad = 50
velocidad

50

A diferencia de esto, los tipos de datos estructurados, permiten almacenar varios valores al mismo tiempo. Esto permite manejar el conjunto
de datos como una unidad. También, a través de la estructura propia de cada tipo, es posible acceder a los valores individuales almacenados.
Tipo de dato Ejemplos

Simple int , float , str , bool

Estructurado list , tuple , dict , set , frozenset

Listas
El tipo de datos estructurado básico de Python es la lista ( list ). Una lista es una secuencia ordenada de datos, que pueden ser de cualquier
tipo, y se indican como una lista de expresiones separadas por comas y entre corchetes. Cada una de las expresiones se convierte en un
elemento de la lista.

Documentación oficial de las listas: https://docs.python.org/3/tutorial/datastructures.html

alumnos = ["Hugo", "Paco", "Luis"]


calificaciones = [90, 75, 80]
print(alumnos, calificaciones)

['Hugo', 'Paco', 'Luis'] [90, 75, 80]

El tamaño o longitud de una lista es el número de elementos que tiene y se obtiene con la función len .

len(alumnos)

Ejercicio: Crea (y muestra) una lista equipo y asígnale los nombres de tus compañeros de equipo para el proyecto. Muestra también la longitud
de la lista.

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 1/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory
equipo = ["César", "Giovanni"]
longitud=len(equipo)
print(equipo,"El equipo es de ", longitud, "personas")

['César', 'Giovanni'] El equipo es de 2 personas

En los ejemplos anteriores, las listas han sido homogéneas, es decir, todos sus elementos son del mismo tipo ( str para la lista alumnos , e int
para la lista calificaciones ).

Esto no es un requisito, los elementos de una lista pueden ser de diferente tipo (listas heterogéneas).

# El primer elemento de la lista es el nombre, el segundo la calificación


# y el tercero si tiene derecho a examen ordinario
alumno1 = ["Hugo", 90, True]
alumno1

['Hugo', 90, True]

Ejercicio: Crea (y muestra) una lista heterogénea donde el primer elemento sea tu nombre; el segundo, la ciudad donde naciste; el tercero, tu
estatura en metros, y el cuarto, tu sabor favorito de helado.

mis_datos = ["César", "Tepic", "1.82m", "vainilla"]


mis_datos

['César', 'Tepic', '1.82m', 'vainilla']

No solo eso, sino que los elementos de una lista pueden ser de cualquier tipo, es decir, pueden ser también listas.

grupo = [["Hugo", 90, True], ["Paco", 75, True], ["Luis", 80, False]]
grupo

[['Hugo', 90, True], ['Paco', 75, True], ['Luis', 80, False]]

Esta misma lista se puede construir a partir de variables que son listas.

hugo = ["Hugo", 90, True]


paco = ["Paco", 75, True]
luis = ['Luis', 80, False]
grupo = [hugo, paco, luis]
grupo

[['Hugo', 90, True], ['Paco', 75, True], ['Luis', 80, False]]

Ejercicio: Crea (y muestra) una lista de listas con la composición de tu familia.

Cada elemento de la lista principal es una lista que representa a un miembro de la familia, y la lista de cada miembro incluye, como primer
elemento, el nombre y, como segundo elemento, su papel en la familia (papá, mamá, hermano, tú, mascota, etc.).

Si se te hace más fácil, primero asigna las listas internas a variables y luego haz la lista familia .

papa = [...]
mama = [...]
etc...
familia = [...]

mama = ["Maricela", "mamá"]


papa = ["Víctor", "papá"]
hermano = ["Luis", "hermano"]
familia = [mama, papa, hermano]
familia

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 2/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

[['Maricela', 'mamá'], ['Víctor', 'papá'], ['Luis', 'hermano']]

Operadores de listas
El operador + se puede usar para concatenar listas y el operador * para replicarlas.

lista_1 = [1, 2, 3]
lista_2 = [9, 10, 11, 12, "a", "b"]
lista_3 = lista_1 + lista_2
print("lista_3 = ", lista_3)

lista_4 = lista_1 * 2 + lista_2


print("lista_4 = ", lista_4)

lista_3 = [1, 2, 3, 9, 10, 11, 12, 'a', 'b']


lista_4 = [1, 2, 3, 1, 2, 3, 9, 10, 11, 12, 'a', 'b']

Ejercicio: Crea cualquier par de listas y concaténalas. Luego, replica la primera lista 10 veces. Muestra el resultado de ambas operaciones.

grupo1 = ["México", "Portugal", "Turquía"]


grupo2 = ["España", "Egipto", "Costa Rica"]
grupo3 = ["Alemania", "Canadá", "Noruega"]
l1 = grupo1 + grupo2
print("Los mejores grupos son: ", l1)

l3 = l1 * 10
print(l3)

Los mejores grupos son: ['México', 'Portugal', 'Turquía', 'España', 'Egipto', 'Costa Rica']
['México', 'Portugal', 'Turquía', 'España', 'Egipto', 'Costa Rica', 'México', 'Portugal', 'Turquía', 'España', 'Egipto', 'Costa Rica',

Indexado de listas
La estructura que tienen las listas (y que permite acceder a sus elementos individuales) es su orden. De acuerdo con ese orden, a cada uno de
sus elementos le corresponde un índice. Así, al primer elemento le corresponde el índice 0 ; al segundo, el 1 , y así, sucesivamente.

Para acceder aun elemento individual, se indica el nombre de la lista y, enseguida, entre corchetes, el número de elemento.

alumnos[0]

'Hugo'

Se permite también el indexado negativo, en donde el elemento -1 es el último; el -2 , el penúltimo, y así sucesivamente.

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 3/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

calificaciones[-1]

80

Slicing de listas
Igualmente, se puede acceder a secuencias de elementos contíguos utilizando dos índices: inicial y final, que se escriben dentro de los
corchetes separados por dos puntos ( : ).

Se debe tomar en cuenta que el elemento en la posición final no se incluye en la secuencia regresada.

comunidad = ["Gandalf", "Frodo", "Sam", "Aragorn", "Legolas", "Gimli", "Pippin", "Merry", "Boromir"]
comunidad[2:5] # Incluye los elementos en las posiciones 2, 3, y 4, pero no el de la 5

['Sam', 'Aragorn', 'Legolas']

Ejercicio: Completa el código de la siguiente celda de acuerdo con lo que se indica.

# El primer elemento
print("Primero:", comunidad[0])

# El penúltimo elemento, usando indexado negativo


print("Penúltimo:", comunidad[-2])

# La secuencia desde Legolas hasta Merry (incluyéndolos), con slicing


print(comunidad[4:8])

# Toda la lista, eliminando el primer y el último elemento, con slicing


print(comunidad[1:-1])

Primero: Gandalf
Penúltimo: Merry
['Legolas', 'Gimli', 'Pippin', 'Merry']
['Frodo', 'Sam', 'Aragorn', 'Legolas', 'Gimli', 'Pippin', 'Merry']

Para acceder a elementos no contíguos de la lista, pero espaciados regularmente, se puede utilizar un tercer entero, después de otros dos
puntos ( : ), que indica el paso (cada cuántos elementos regresar).

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]


numeros[1:12:3]

[2, 5, 8, 11]

Si se omite cualquiera de los tres índices del slicing (inicio, fin y/o paso), se usan valores predeterminados:

Inicio omitido: Tomar desde el principio


Final omitido: Tomar hasta el final
Paso omitido: Tomar de uno en uno, que es lo más usual

print("Los primeros tres:", comunidad[:3])


print("Los últimos cuatro:", comunidad[-4:])

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 4/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

Los primeros tres: ['Gandalf', 'Frodo', 'Sam']


Los últimos cuatro: ['Gimli', 'Pippin', 'Merry', 'Boromir']

Para indexar listas dentro de listas, hay que usar dos índices, cada uno dentro de sus propios corchetes, el primero se refiere a la lista "exterior",
y el segundo, a la "interior".

En el siguiente ejemplo, tenemos una lista donde cada personaje está representad por una lista que indica su nombre y su raza. Para conocer
la raza del quinto integrante de la comunidad, podemos usar:

comunidad2 = [
["Gandalf", "mago"],
["Frodo", "hobbit"],
["Sam", "hobbit"],
["Aragorn", "humano"],
["Legolas", "elfo"],
["Gimli", "enano"],
["Pippin", "hobbit"],
["Merry", "hobbit"],
["Boromir", "humano"]
]
nombre = comunidad2[4][0]
raza = comunidad2[4][1]
print(f"La raza de {nombre} es {raza}.")

La raza de Legolas es elfo.

Si se facilita, se puede utilizar una variable intermedia para extraer la lista interior y, así, utilizar solamente un índice cada vez.

personaje = comunidad2[4]
nombre = personaje[0]
raza = personaje[1]
print(f"La raza de {nombre} es {raza}.")

La raza de Legolas es elfo.

Ejercicio: Utilizando la lista familia que hiciste, añade, para cada integrante, el dato de su edad y, luego, imprime un mensaje del tipo:
"Fulanito es mi hermano y tiene 7 años" .

familia = [
["Maricela", "mamá", 56],
["Victor", "papá", 54],
["Maricela", "hermano", 17],
]
quien_es = familia[0]
nombre = quien_es[0]
rol = quien_es[1]
edad = quien_es[2]
print(f"{nombre} es mi {rol} y tiene {edad} años")

Maricela es mi mamá y tiene 56 años

Modificando los elementos de una lista


Las listas son mutables, es decir, es posible modificar sus elementos individuales. Esto se hace mediante una simple asignación.

los_4F = ["Reed Richard", "Sue Storm", "Tony Stark", "Ben Grimm"]


print("Lista original: ", los_4F)
# ¡Ups!
los_4F[2] = "Johny Storm"
print("Lista corregida:", los_4F)

Lista original: ['Reed Richard', 'Sue Storm', 'Tony Stark', 'Ben Grimm']
Lista corregida: ['Reed Richard', 'Sue Storm', 'Johny Storm', 'Ben Grimm']

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 5/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory
Ejercicio: Escribe en la siguiente celda una instrucción de asignación para corregir el apellido de Reed. Debe ser "Richards", no "Richard".
Muestra, al final, la lista corregida.

los_4F = ["Reed Richard", "Sue Storm", "Tony Stark", "Ben Grimm"]


print("Lista original: ", los_4F)
# ¡Ups!
los_4F[0] = "Reed Richards"
print("Lista corregida:", los_4F)

Lista original: ['Reed Richard', 'Sue Storm', 'Tony Stark', 'Ben Grimm']
Lista corregida: ['Reed Richards', 'Sue Storm', 'Tony Stark', 'Ben Grimm']

Es posible, mediante una única asignación, reemplazar varios elementos contiguos en la lista, reemplazar un único elemento de una lista por
más de un elemento, o reemplazar varios elementos contiguos en la lista por una cantidad diferente de elementos, haciendo la asignación a
una slice de la lista en lugar de a un elemento.

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("Original: a =", a)
a[5:7] = [500, 600] # Reemplazar elementos 5 y 6
print("Cambio 1: a =", a)
a[5:6] = [10, 20, 30] # Reemplazar el elemento 5 por tres elementos
print("Cambio 2: a =", a)
a[1:4] = ["a", "b"] # Reemplazar tres elementos (1,2,3) por dos
print("Cambio 3: a =", a)

Original: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Cambio 1: a = [0, 1, 2, 3, 4, 500, 600, 7, 8, 9]
Cambio 2: a = [0, 1, 2, 3, 4, 10, 20, 30, 600, 7, 8, 9]
Cambio 3: a = [0, 'a', 'b', 4, 10, 20, 30, 600, 7, 8, 9]

Ejercicio: Añade una instrucción de asignación en la siguiente celda para cambiar el elemento "cebolla" por los elementos "mandarina" y "kiwi".
No modifiques el código que ya está escrito. Muestra, al final, la lista corregida.

frutas = ["manzana", "naranja", "pera", "cebolla", "sandía", "papaya"]


print("Frutas: ", frutas)
frutas[3] = ["Mandarina", "kiwi"]
print("Frutas: ", frutas)

Frutas: ['manzana', 'naranja', 'pera', 'cebolla', 'sandía', 'papaya']


Frutas: ['manzana', 'naranja', 'pera', ['Mandarina', 'kiwi'], 'sandía', 'papaya']

Agregando elementos a la lista


append

Se utiliza el método append para agregar elementos a la lista.

avengers = ["Capitán América", "Iron Man", "Hulk"]


avengers.append("Thor")
avengers

['Capitán América', 'Iron Man', 'Hulk', 'Thor']

Es común utilizar append para recibir un número variable de entradas del usuario, como en el siguiente ejemplo:

print("Introduzca a continuación los nombres de los alumnos.")


print("De [Enter] sin introducir un nombre para terminar.")
alumnos = []
alumno = input("Nombre del alumno: ")
while alumno != "":
alumnos.append(alumno)

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 6/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory
alumno = input("Nombre del alumno: ")
alumnos

Introduzca a continuación los nombres de los alumnos.


De [Enter] sin introducir un nombre para terminar.
Nombre del alumno: cesar
Nombre del alumno: azul
Nombre del alumno:
['cesar', 'azul']

Tip: El ejemplo anterior muestra el uso de un valor centinela, un valor especial (en este caso, la cadena nula — "" ) para indicar el fin de los
datos.

Observación: Debido a que el valor de la variable alumno es la que controla la ejecución del ciclo, la instrucción input que le asigna valor
aparece duplicada en el código:

Una vez antes del inicio del ciclo, para obtener un valor inicial.
Otra vez dentro del ciclo, al final del mismo, ya que por cada ejecución del ciclo es necesario asignarle un nuevo valor.

Paréntesis opcional: Expresiones de asignación


Python 3.8 introdujo las expresiones de asignación y el operador walrus ( := ). Esto nos permite, al mismo tiempo, asignar un valor a una
variable y utilizarlo. Lo "normal" es que el valor ya exista antes de poderlo utilizar.

Por ejemplo, haciendo uso de las expresiones de asignación, podemos cambiar nuestro código como sigue:

print("Introduzca a continuación los nombres de los alumnos.")


print("De [Enter] sin introducir un nombre para terminar.")
alumnos = []
while (alumno := input("Nombre del alumno: ")) != "":
alumnos.append(alumno)
alumnos

Introduzca a continuación los nombres de los alumnos.


De [Enter] sin introducir un nombre para terminar.
Nombre del alumno: cesar
Nombre del alumno: cris
Nombre del alumno:
['cesar', 'cris']

Contesta: ¿Qué fue lo que cambió entre el ejemplo de la celda de arriba y el anterior?

Respuesta:Se redujeron las líneas de código

Paréntesis opcional: Valores truthy y falsy


El ejemplo podría simplificarse un poco más haciendo uso del hecho de que Python reconoce como condiciones no solo expresiones lógicas,
sino expresiones que pueden interpretarse como True (truthy) o False (falsy), sin ser, propiamente, expresiones lógicas.

En particular, a manera de ejemplo, la línea:

while numero != 0:

Se puede reemplazar por:

while numero:

Porque Python interpreta el valor 0 como falsy (equivalente a False ) y cualquier otro valor numérico como truthy (equivalente a True ).

Igualmente, también a manera de ejemplo, las siguientes tres líneas son equivalentes:

if cadena != "":

if len(cadena) > 0:

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 7/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

if cadena:

Porque, igualmente, Python interpreta la cadena vacía ( "" ) como falsy y cualquier otra cadena como truthy.

La siguiente tabla muestra los valores truthy y falsy¨:

cero 0 , 0.0
cadena nula ""
Valores falsy
(Se evalúan a False ) lista vacía []
(o cualquier secuencia o colección vacía)
constantes literales None y False

números diferentes de cero


Valores truthy
(Se evalúan a True secuencias o colecciones no vacías
constante literal True

En nuestro ejemplo de arriba, vamos a sustituir la instrucción:

while alumno != "":

Por:

while alumno:

Y quedaría:

print("Introduzca a continuación los nombres de los alumnos.")


print("De [Enter] sin introducir un nombre para terminar.")
alumnos = []
while (alumno := input("Nombre del alumno: ")):
alumnos.append(alumno)
alumnos

Introduzca a continuación los nombres de los alumnos.


De [Enter] sin introducir un nombre para terminar.
Nombre del alumno: cesar
Nombre del alumno: gio
Nombre del alumno:
['cesar', 'gio']

Ejercicio: Completa el código de la celda de abajo para construir una lista con las estaturas de una muestra de personas y, después, calcular el
promedio.

Para indicar el final de la entrada de datos, utilizaremos el valor centinela -1 .

estaturas=[]
while True:
estatura = float(input("Ingresa una estatura (o -1 para finalizar): "))
if estatura == -1:
estaturas.append(estatura)

if len(estaturas) > 0:
promedio = sum(estaturas) / len(estaturas)
print(f"El promedio de las estaturas es: {promedio}")

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 8/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

---------------------------------------------------------------------------
KeyboardInterrupt Traceback (most recent call last)
<ipython-input-76-14bb01ebef62> in <cell line: 2>()
1 estaturas=[]
2 while True:
----> 3 estatura = float(input("Ingresa una estatura (o -1 para finalizar): "))
4 if estatura == -1:
5 break

1 frames
Añadir elementos a una lista por concatenación
/usr/local/lib/python3.10/dist-packages/ipykernel/kernelbase.py in _input_request(self, prompt, ident, parent, password)
893 except KeyboardInterrupt:
El método894 # re-raise
append añade el nuevo KeyboardInterrupt,
dato al final to truncate
de la lista. Es el método traceback
más común y eficiente.
--> 895 raise KeyboardInterrupt("Interrupted by user") from None
896 except Exception as e:
También se puede usar la concatenación para añadir datos al final de una lista. Con concatenación, se pueden añadir los elementos de uno en
897 self.log.warning("Invalid Message:", exc_info=True)
uno o de varios.
KeyboardInterrupt: Interrupted by user
Igualmente, se pueden usar los operadores de asignación modificados += y *= con las listas.
BUSCAR EN STACK OVERFLOW

a = [0, 1, 2]
b = ["A"]
c = ["x", "y", 100]
print("Original: ", a)
a += b # Equivalente a: a = a + b
print("Después de añadir b:", a)
a += c # Equivalente a: a = a + c
print("Después de añadir c:", a)
a *= 2 # Equivalente a: a = a * 2
print("Después de duplicar:", a)

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-72-e1dc2709c880> in <cell line: 4>()
2 b = ["A"]
3 c = ["x", "y", 100]
----> 4 print("Original: ", a)
5 a += b # Equivalente a: a = a + b
6 print("Después de añadir b:", a)

TypeError: 'list' object is not callable

BUSCAR EN STACK OVERFLOW

insert y extend

Otras formas de añadir datos a una lista son:

Método insert : Agrega un elemento en una posición determinada


Método extend : Agrega los elementos de un iterable (por ejemplo, otra lista) al final de la lista

a = [0, 1, 2]
a.insert(1, 100)
a

[0, 100, 1, 2]

a = [0, 1, 2]
b = [10, 11, 12]
a.extend(b)
a

[0, 1, 2, 10, 11, 12]

Un método eqivalente a extend es asignar una lista a una slice de la que se desea modificar después del último elemento de esta.

a = [0, 1, 2]
b = [10, 11, 12, 13]
a[len(a):] = b # El último elemento de a es a[len(a)-1], ¿cierto?
a

[0, 1, 2, 10, 11, 12, 13]

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 9/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory
Contesta: Cómo interpretas la slice a la que se le hizo la asignación en el último ejemplo?

a[len(a):]

¿Dónde inicia, dónde termina? ¿Por qué se dice que está después del final de la lista?

Respuesta: Inicia a poner la lista b al final de la lista gracias a lo dos puntos al final de a[len(a):]

Eliminando elementos de una lista


del

del borra un elemento de la lista especificado por su posición.

print("Original: ", comunidad)


del(comunidad[2]) # Borrar el elemento en posición 2
print("Después: ", comunidad)

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-78-0395cc3105d5> in <cell line: 1>()
----> 1 print("Original: ", comunidad)
2 del(comunidad[2]) # Borrar el elemento en posición 2
3 print("Después: ", comunidad)

TypeError: 'list' object is not callable

BUSCAR EN STACK OVERFLOW

remove

remove elimina el primer elemento que coincida con su parámetro. Ocasiona un error si no lo encuentra.

comunidad.remove("Boromir")
comunidad

['Gandalf', 'Frodo', 'Sam', 'Aragorn', 'Legolas', 'Gimli', 'Pippin', 'Merry']

pop

pop elimina el último elemento de la lista pero, adicionalmente, regresa el valor eliminado. Es muy usado para procesar uno a uno los
elementos de una lista, comenzando por el último, hasta que queda vacía.

Este tipo de procesos, en donde el último elemento añadido es el primer elemento procesado (LIFO: last in, first out) reciben el nombre de pilas
(stacks en inglés) y es un patrón recurrente en programación.

comunidad = ["Gandalf", "Frodo", "Sam", "Aragorn", "Legolas", "Gimli", "Pippin", "Merry", "Boromir"]
print("Lista original:", comunidad)
print()
while comunidad:
siguiente = comunidad.pop()
print("Procesando:", siguiente)
print("Restante:", comunidad)
print()
print("Lista final:", comunidad)

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 10/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-83-d88d4dfed0a3> in <cell line: 2>()
1 comunidad = ["Gandalf", "Frodo", "Sam", "Aragorn", "Legolas", "Gimli", "Pippin", "Merry", "Boromir"]
----> 2 print("Lista original:", comunidad)
Un proceso 3similar,
print()pero en el cual el primer elemento añadido es el primero procesado (FIFO: first in, first out), también es recurrente en
4 while comunidad:
programación y recibe el nombre de filas (queues en inglés).
5 siguiente = comunidad.pop()
El método pop admite un parámetro opcional, la posición de la cual extraer el elemento, por lo tanto, también se pueden implementar las filas
TypeError: 'list' object is not callable
usando listas y pop , indicando la posición 0 , aunque esto no es muy eficiente. (Es eficiente añadir y quitar elementos del final de una lista,
hacerloBUSCAR
al principio o en
EN STACK una posición intermedia, no es eficiente porque hay que desplazar de lugar el resto de los elementos.)
OVERFLOW

comunidad = ["Gandalf", "Frodo", "Sam", "Aragorn", "Legolas", "Gimli", "Pippin", "Merry", "Boromir"]
print("Lista original:", comunidad)
print()
while comunidad:
siguiente = comunidad.pop(0)
print("Procesando:", siguiente)
print("Restante:", comunidad)
print()
print("Lista final:", comunidad)

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-82-2fff27b2d499> in <cell line: 2>()
1 comunidad = ["Gandalf", "Frodo", "Sam", "Aragorn", "Legolas", "Gimli", "Pippin", "Merry", "Boromir"]
----> 2 print("Lista original:", comunidad)
3 print()
4 while comunidad:
5 siguiente = comunidad.pop(0)

TypeError: 'list' object is not callable

BUSCAR EN STACK OVERFLOW

Contesta: Cuáles fueron las diferencias entre los últimos dos ejemplos? En particular, ¿cómo cambio el uso de pop y el orden en que se
"procesó" la lista?

Respuesta: El elemento a cambiar, y que en el segundo caso como se dice, no es tan eficiente

clear

Finalmente, clear elimina todos los elementos de una lista.

avengers = ["Capitan america", "hulk"]


print(avengers)
avengers.clear()
print(avengers)

['Capitan america', 'hulk']


[]

Funciones y métodos de listas


list

Tenemos la función list que es la constructora de listas.

list() sin argumentos regresa la lista vacía, de tal forma que:

a = list()

Es equivalente a:

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 11/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

a = []

También podemos indicar como argumento de list un iterable y cada elemento del iterable se convierte en un elemento de la lista creada.

Por ejemplo, una cadena es iterable, y cada carácter se convertiría en un elemento de la lista.

frase = "Esto es un ejemplo."


letras = list(frase)
letras

['E',
's',
't',
'o',
' ',
'e',
's',
' ',
'u',
'n',
' ',
'e',
'j',
'e',
'm',
'p',
'l',
'o',
'.']

range

Existe la función range , que es una generadora de secuencias. En particular, genera una secuencia de números enteros en un rango dado.

Si se le llama con un parámetro ( range(n) ), genera la secuencia desde 0 hasta n-1 .

Si se le llama con dos parámetros ( range(n, m) ), genera la secuencia desde n hasta n-1 .

Si se le llama con tres parámetros ( range(n, m, p) ), genera la secuencia: n , n+p , n+2p , ..., n+ip , ..., n+qp < m .

Si se combina la generadora range con la constructora list , el rango generado se convierte en una lista.

rango = range(10)
lista = list(range(10))
print(rango)
print(lista)

range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

max , min , sum y len

Las funciones max , min , sum y len regresan, respectivamente, el elemento mayor, el menor, la suma de los elementos y el número de
elementos de una lista (y otro iterable).

Ejercicio: Completa el código de la siguiente celda para calcular los estadísticos de la muestra. Muestra los resultados con dos decimales.

Tip: ¿Servirán de algo las funciones sum y len ?

import random
muestra = random.sample(range(1000), k=17)
minimo = min(muestra)
maximo = max(muestra)
promedio = sum(muestra) / len(muestra)
minimoo = "{:.2f}".format(minimo)
maximoo = "{:.2f}".format(maximo)
promedioo = "{:.2f}".format(promedio)
print(f"Muestra: {muestra}")
print(f"Mínimo: {minimoo}")
print(f"Máximo: {maximoo}")
print(f"Promedio: {promedioo}")

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 12/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

Muestra: [989, 35, 629, 220, 922, 79, 924, 228, 646, 993, 395, 173, 528, 294, 297, 374, 175]
Mínimo: 35.00
Máximo: 993.00
Promedio: 464.76

sorted y sort

La función sorted y el método sort se utilizan para ordenar iterables, entre ellos, listas.

La función sorted no modifica el iterable, sino que regresa una copia del iterable en orden.

El método sort sí modifica el iterable.

Ambos tienen un parámtero opcional, reverse para indicar si se desea el orden inverso (de mayor a menor).

x = random.sample(range(1000), k=15)
print("Lista original: x =", x)
y = sorted(x)
print("Lista ordenada: y =", y)
print("x sigue igual: x =", x)
x.sort(reverse=True) # Ojo: no hay asignación
print("x modificada: x =", x)

Lista original: x = [789, 951, 77, 729, 843, 584, 247, 664, 347, 254, 910, 493, 185, 287, 367]
Lista ordenada: y = [77, 185, 247, 254, 287, 347, 367, 493, 584, 664, 729, 789, 843, 910, 951]
x sigue igual: x = [789, 951, 77, 729, 843, 584, 247, 664, 347, 254, 910, 493, 185, 287, 367]
x modificada: x = [951, 910, 843, 789, 729, 664, 584, 493, 367, 347, 287, 254, 247, 185, 77]

Sigue explorando las listas


Existen más funciones y métodos de listas, y los expuestos tienen más parámetros que los aquí presentados. Para más detalles, se puede
consultar la documentación oficial: https://docs.python.org/3/tutorial/datastructures.html

Ejercicios
Continuando con el desarrollo del sistema de control de alumnos, vamos a guardar los datos de los alumnos en una estructura de la siguiente
forma:

Tendremos una lista alumnos con los datos de todos los alumnos.
De esta manera, cada alumno, será un elemento de la lista alumnos .
Al mismo tiempo, cada alumno será, a su vez, una lista.

El primer elemento de la lista, será el nombre del alumno.


El segundo elemento, una lista con sus calificaciones.
El tercer elemento, el promedio de las calificaciones.

Por ejemplo:

alumnos = [
["Scott Summers", [85, 90, 80], 85.0], # Primer alumno
["Bobby Drake", [60, 60, 50, 60], 57.5], # Segundo alumno
["Hank McCoy", [100, 100, 100, 100], 100.0] # Tercer alumno
]

Todos los alumnos están en una lista, cada alumno es una lista y, adentro de esa lista, hay otra lista con sus respectivas calificaciones.
Estamos manejando listas anidadas en tres niveles: listas adentro de listas adentro de listas.

Nos vamos a ir por partes para poder darle entrada a todos los elementos de esta estructura.

Primera parte: Completa el código de la celda de abajo para construir una lista con las calificaciones de un alumno.

Para indicar el final de la entrada de datos, utilizaremos el valor centinela -1 .

Al final, calcula el promedio de las calificaciones.

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 13/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory
Puedes usar el mismo código que para el ejercicio de las estaturas más arriba, ya sea usando expresiones de asignación con el operador
walrus, o duplicando la instrucción input (una vez fuera del ciclo y otra vez dentro).

# Inicializa la lista calificaciones


calificaciones = []
# En un ciclo, ve pidiendo cada calificación
while True:
calificacion = float(input("Ingresa una calificación (o -1 para finalizar): "))

if calificacion == -1:
break

calificaciones.append(calificacion)

# Calcula el promedio
if len(calificaciones) > 0:
promedio = sum(calificaciones) / len(calificaciones)
# Muestra las dos variables
print(f"Las calificaciones ingresadas son: {calificaciones}")
print(f"El promedio de las calificaciones es: {promedio:.2f}")
else:
print("No se ingresaron calificaciones.")

Ingresa una calificación (o -1 para finalizar): 10


Ingresa una calificación (o -1 para finalizar): 10
Ingresa una calificación (o -1 para finalizar): 10
Ingresa una calificación (o -1 para finalizar): -1
Las calificaciones ingresadas son: [10.0, 10.0, 10.0]
El promedio de las calificaciones es: 10.00

Segunda parte: Completa el código de abajo para también:

1. Solicitar, al inicio, el nombre del alumno,


2. Introducir las calificaciones del alumno,
3. Calcular el promedio, y
4. Al final, colocar los tres elementos ( nombre , calificaciones y promedio ) en la lista alumno

# Solicitar el nombre del alumno


alumno = (input("Ingresa tu nombre: "))
calificaciones = []
while True:
calificacion = float(input("Ingresa una calificación (o -1 para finalizar): "))

if calificacion == -1:
break

calificaciones.append(calificacion)

# Calcula el promedio
if len(calificaciones) > 0:
promedio = sum(calificaciones) / len(calificaciones)
# Muestra las dos variables
print(f"Las calificaciones ingresadas son: {calificaciones}")
print(f"El promedio de las calificaciones es: {promedio:.2f}")
else:
print("No se ingresaron calificaciones.")

# Ahora, poner los tres elementos en una lista


alumno = [alumno, calificaciones, promedio]
# Mostrar cómo quedó
print(f"Nombre del alumno: {alumno[0]}")
print(f"Calificaciones: {alumno[1]}")
print(f"Promedio: {alumno[2]}")

Ingresa tu nombre: cesar


Ingresa una calificación (o -1 para finalizar): 10
Ingresa una calificación (o -1 para finalizar): 10
Ingresa una calificación (o -1 para finalizar): 10

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 14/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory
Ingresa una calificación (o -1 para finalizar): -1
Las calificaciones ingresadas son: [10.0, 10.0, 10.0]
El promedio de las calificaciones es: 10.00
Nombre del alumno: cesar
Calificaciones: [10.0, 10.0, 10.0]
Promedio: 10.00

Tercera parte: Completa el código de abajo para colocar el código que escribiste antes dentro de un ciclo que se va a repetir hasta que se
hayan introducido los datos de todos los alumnos:

1. Inicializar la lista alumnos .

2. Solicitar el nombre del alumno. Hay que pensar en un valor centinela para indicar que ya se terminó con la captura de alumnos, puede ser
la cadena vacía ( "" ).

3. Si se dio un nombre de alumno:

1. Introducir las calificaciones del alumno,


2. Calcular el promedio,
3. Colocar nombre , calificaciones y promedio en la lista alumno , y
4. Añadir la lista alumno recién creada a la lista "maestra" alumnos .

# Inicializa la lista alumnos


maestra_alumnos = []

while True:
nombre = input("Ingrese el nombre del alumno (o presione Enter para terminar): ")

if nombre == "":
break

calificaciones = []
while True:
calificacion = float(input("Ingresa una calificación (o -1 para finalizar): "))

if calificacion == -1:
break

calificaciones.append(calificacion)

if len(calificaciones) > 0:
promedio = sum(calificaciones) / len(calificaciones)
else:
promedio = 0

alumno =[nombre, calificaciones, promedio]

maestra_alumnos.append(alumno)

# Imprime la lista maestra de alumnos


print("Lista maestra de alumnos:")
for alumno in maestra_alumnos:
print(f"Nombre: {nombre}, Calificaciones: {alumno[1]}, Promedio: {alumno[2]:.2f}")

output Ingrese el nombre del alumno (o presione Enter para terminar): cesar
Ingrese el nombre del alumno (o presione Enter para terminar):
Ingresa una calificación (o -1 para finalizar): 10
Ingresa una calificación (o -1 para finalizar): 10
Ingresa una calificación (o -1 para finalizar): 10
Ingresa una calificación (o -1 para finalizar): -1
Lista maestra de alumnos:
Nombre: , Calificaciones: [10.0, 10.0, 10.0], Promedio: 10.00

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 15/16
8/10/23, 23:20 Copia de Listas.ipynb - Colaboratory

https://colab.research.google.com/drive/1YDfXwJ4lDlq5yEKKHNaRgEwlpnqXjTZ-#scrollTo=rUtXpLlar2lp&uniqifier=1&printMode=true 16/16

También podría gustarte