- Aprender
- Informática
- Programación
- Introducción a la programación con Python
- Listas y tuplas en Python
Listas y tuplas en Python
sort(), sorted() y funciones de clave de ordenación.PrincipianteUnidad 6 de 10 del curso Curso de Introducción a la programación con Python
Lo que aprenderás
- Crea listas, lee elementos individuales y segmentos mediante índices, y combina listas y resume sus datos con operadores y funciones incorporadas de Python.
- Crea una lista y lee sus elementos mediante índicesEscribe literales de lista, construye listas con list(), mide su longitud con len(), lee elementos mediante índices positivos y negativos, y comprueba la pertenencia con in.
- Extrae un segmento de una listaExtrae una parte de una lista con segmentos start:stop:step, predice el resultado cuando se omiten valores, son negativos o quedan fuera de rango, y distingue un segmento de un elemento individual.
- Combina listas y resume sus datos con operadores y funciones incorporadasUne y repite listas con + y *, compara listas, calcula sumas, extremos y medias con sum(), min() y max(), y convierte entre cadenas y listas.
- Crea una lista y lee sus elementos mediante índices
- Añade, inserta, elimina, busca y sustituye elementos de una lista, y usa correctamente el efecto y el valor de retorno de cada método.
- Añade y elimina elementosAmplía y reduce una lista con append(), extend(), insert(), pop(), remove(), del y clear(), y distingue sus efectos y valores de retorno.
- Busca, cuenta y sustituye elementosLocaliza valores con index(), count() e in, y sustituye elementos individuales o rangos completos mediante asignaciones a un índice o a un segmento.
- Añade y elimina elementos
- Recorre todos los elementos de una lista con bucles, aplica patrones de conteo, suma, búsqueda, filtrado y transformación, y trabaja con listas de listas como tablas.
- Recorre elementos y posiciones con buclesElige entre recorrer elementos, índices con range(len()), o ambos con enumerate() y zip(), y modifica una lista de forma segura mientras la procesas.
- Aplica patrones habituales de procesamiento de listasSuma, cuenta, busca extremos, realiza búsquedas, filtra y transforma los elementos de una lista con bucles, y reconoce cuándo una función incorporada realiza la misma tarea.
- Trabaja con listas anidadasAlmacena una tabla como una lista de filas, lee y modifica celdas con dos índices, y recorre todas las celdas con bucles anidados.
- Recorre elementos y posiciones con bucles
- Almacena grupos fijos de valores en tuplas, decide cuándo conviene una tupla en lugar de una lista y desempaqueta secuencias en variables independientes.
- Crea tuplas y elige entre tuplas y listasEscribe tuplas, incluidas las vacías y las de un elemento, léelas mediante índices y segmentos, y explica qué permite y qué impide su inmutabilidad.
- Empaqueta y desempaqueta valoresAsigna varias variables a la vez a partir de una tupla o lista, intercambia dos valores, recoge los valores restantes con un nombre precedido de asterisco y devuelve varios valores desde una función.
- Crea tuplas y elige entre tuplas y listas
- Predice cómo se refleja en otras variables un cambio realizado mediante una de ellas, copia listas cuando necesites independencia y pasa listas a funciones sin sorpresas.
- Distingue entre nombres, objetos y aliasExplica que las variables hacen referencia a objetos, reconoce cuándo dos nombres comparten una lista y distingue la identidad (is) de la igualdad (==), y la mutación de la revinculación.
- Copia listas y evita compartir listas internasHaz una copia independiente mediante segmentos, list() o copy(), reconoce cuándo una copia superficial sigue compartiendo listas anidadas y usa una copia profunda cuando no deban compartirse.
- Pasa listas a funciones y devuélvelasPredice cuándo una función modifica la lista del código que la llama, elige entre modificar la lista original o devolver una nueva, y evita los argumentos predeterminados mutables.
- Distingue entre nombres, objetos y alias
- Ordena datos con sort() y sorted(), de forma ascendente o descendente, y controla el orden con funciones de clave de ordenación y las reglas de comparación de tuplas.
- Ordena con sort() y sorted()Elige entre ordenar la lista original o crear una copia ordenada, ordena de forma descendente, distingue invertir de ordenar y predice cómo se ordenan números y cadenas.
- Ordena por una clave y ordena registrosOrdena por una clave calculada, como la longitud o el texto en minúsculas, ordena listas de tuplas por uno o varios campos y usa la estabilidad de la ordenación de Python.
- Ordena con sort() y sorted()
Guía de estudio de Listas y tuplas en Python
1Crea y lee listas
Una lista ofrece al programa un lugar donde guardar una colección ordenada, como puntuaciones o nombres. Sus posiciones permiten acceder a un elemento concreto, mientras que los segmentos permiten seleccionar una sucesión de elementos o recorrerlos siguiendo un patrón. Crear, leer y combinar listas produce varios tipos de resultados: un elemento individual, una lista nueva, un número o una cadena. Seguir esos resultados facilita elegir la siguiente operación y detectar un error de límites.
1.1 Crea una lista y lee una posición
Una lista conserva valores en un orden elegido. Escribe los elementos entre corchetes, separados por comas. Cada elemento tiene una posición, por lo que los valores repetidos siguen ocupando lugares distintos.
Construye y mide una lista
scores = [88, 92, 75]
print(scores)
print(len(scores))
Salida:
[88, 92, 75]
3
len() cuenta elementos, no el valor más alto ni la posición final. Las listas pueden contener tipos mixtos, como en [3, "three", 3.0, True], aunque agrupar datos relacionados suele facilitar su procesamiento. Tanto [] como list() crean una lista vacía. Su longitud es 0, y puede crecer a medida que el programa recopila valores.
list() también puede reunir los elementos de un iterable, un objeto que un bucle for puede recorrer. list(range(4)) da [0, 1, 2, 3]. list("cat") da ['c', 'a', 't']: la cadena aporta un carácter cada vez. El resultado es una lista nueva.
Cuenta posiciones desde cero
Un índice identifica una posición. Python empieza en 0, por lo que las tres puntuaciones tienen los índices 0, 1 y 2.
| Expresión | Resultado | Posición |
|---|---|---|
scores[0] | 88 | Primera |
scores[1] | 92 | Segunda |
scores[2] | 75 | Tercera |
scores[-1] | 75 | Última |
scores[-2] | 92 | Penúltima |
scores[-3] | 88 | Antepenúltima |
Los índices negativos cuentan hacia atrás desde el final. Para una lista de longitud n, los índices válidos van de -n a n - 1. El último elemento es scores[len(scores) - 1] o, más sencillamente, scores[-1]. -0 sigue siendo 0; no significa la última posición.
Reconoce un índice no válido
scores[3] lanza IndexError porque no existe un cuarto elemento. scores[len(scores)] comete el mismo error: el número de elementos es uno mayor que el último índice no negativo. Una lista vacía no tiene ningún índice de elemento válido, incluido -1.
Un índice de lista debe ser un entero, no un número de coma flotante. scores[1.0] lanza TypeError, aunque 1,0 tenga un valor entero. / produce un número de coma flotante, por lo que scores[len(scores) / 2] también falla. Con esta lista de tres elementos, len(scores) // 2 produce el entero 1, y scores[1] es 92.
Comprueba si aparece un valor
La pertenencia comprueba valores, no posiciones:
colors = ["red", "green"]
print("green" in colors)
print("Green" in colors)
print("blue" not in colors)
Salida:
True
False
True
in y not in devuelven valores booleanos y también funcionan con listas vacías. Las comparaciones de cadenas distinguen entre mayúsculas y minúsculas, por lo que "Green" y "green" no coinciden. Una comprobación de pertenencia es útil antes de una operación que requiera que un valor esté presente, como eliminarlo o encontrar su posición.
Puntos clave
- Las listas conservan el orden y pueden contener valores repetidos.
len(values)cuenta elementos; el último índice no negativo eslen(values) - 1.- Los índices negativos cuentan desde el final, empezando por
-1. - Un índice de elemento no válido lanza
IndexError; un índice de coma flotante lanzaTypeError. incomprueba si aparece un valor igual en la lista.
1.2 Extrae un segmento de una secuencia
Un segmento selecciona una secuencia de elementos y devuelve una secuencia nueva. Para una lista, el resultado es otra lista, incluso cuando contiene un solo elemento o ninguno.
Incluye el inicio y excluye el límite final
letters = ["a", "b", "c", "d", "e", "f"]
print(letters[1:4])
Salida:
['b', 'c', 'd']
Las posiciones seleccionadas son 1, 2 y 3. La posición 4 es el límite de parada, por lo que 'e' queda fuera. Con un paso de 1 y límites que cumplan 0 <= start <= stop <= len(letters), el número de elementos seleccionados es stop - start. Aquí es 3. letters[4:2] da [] porque un segmento que avanza no puede alcanzar un límite final anterior.
Omite un límite
| Segmento | Significado | Resultado |
|---|---|---|
letters[:2] | Primeros dos elementos | ['a', 'b'] |
letters[4:] | Desde la posición 4 hasta el final | ['e', 'f'] |
letters[:] | Todos los elementos en una lista nueva | ['a', 'b', 'c', 'd', 'e', 'f'] |
letters[-2:] | Últimos dos elementos | ['e', 'f'] |
letters[:-1] | Todos salvo el último | ['a', 'b', 'c', 'd', 'e'] |
Los límites negativos cuentan desde el final igual que los índices negativos. letters[:n] y letters[n:] dividen la lista en un mismo límite. Unir esos dos segmentos reconstruye su contenido en el orden original.
Controla el paso
La forma completa es values[start:stop:step]. Un paso de 2 selecciona una posición, omite una y selecciona la siguiente. letters[::2] da ['a', 'c', 'e'], mientras que letters[1::2] da ['b', 'd', 'f'].
Un paso negativo retrocede. letters[::-1] empieza en el último elemento y produce ['f', 'e', 'd', 'c', 'b', 'a']. Para un segmento hacia atrás con límites, letters[4:1:-1] recorre los índices 4, 3 y 2, dando ['e', 'd', 'c']; el límite final sigue excluido. Un paso de 0 lanza ValueError porque no puede desplazarse a otra posición.
Distingue un límite de una posición
Los límites de los segmentos pueden sobrepasar cualquiera de los extremos. Python los ajusta: letters[4:100] es ['e', 'f'], y letters[10:] es []. Estos segmentos no lanzan IndexError. Leer el elemento individual letters[10] sí lo hace.
letters[2] es la cadena 'c'. letters[2:3] es la lista ['c']. Los dos puntos cambian el tipo de resultado, lo que importa cuando el código posterior espera una cadena o una lista.
Trabaja con el resultado
Tras first_three = letters[:3], asignar first_three[0] = "z" modifica solo esa lista externa nueva; letters[0] sigue siendo 'a'. Un segmento completo es una copia superficial, por lo que los elementos mutables anidados pueden seguir compartidos.
Las cadenas y las tuplas siguen las mismas reglas de límites y paso. El resultado conserva el tipo de la secuencia original: "python"[1:4] da 'yth', y (10, 20, 30)[1:] da (20, 30).
Puntos clave
- Un segmento incluye su inicio y excluye su límite final.
- Los límites omitidos seleccionan hasta el extremo correspondiente de la secuencia.
- El paso controla la dirección y la separación; cero no es válido.
- Los límites de segmento fuera de rango se ajustan a los extremos.
- Acceder a un elemento devuelve un elemento; un segmento devuelve una secuencia.
- Un segmento de lista crea una lista externa nueva.
1.3 Combina valores y calcula resúmenes
Las listas admiten operadores para construir secuencias y funciones para resumir sus valores. Comprueba si una operación crea una lista nueva, produce un número o devuelve texto: esos resultados sirven para tareas distintas.
Une o repite listas
+ une dos listas y crea una lista nueva. [1, 2] + [3] da [1, 2, 3] sin modificar ninguna de las entradas. Ambos operandos deben ser listas: [1, 2] + 3 lanza TypeError. Coloca un único valor adicional en una lista de un elemento al usar +.
* repite la secuencia. [0] * 4 da [0, 0, 0, 0], y ["ab", "cd"] * 2 da ['ab', 'cd', 'ab', 'cd']. Repite elementos, no los caracteres de cada cadena. Una cantidad de repeticiones de cero o negativa da []. counts = [0] * 7 proporciona siete contadores iniciales. Repetir una lista interna hace que se comparta entre posiciones, lo que importa cuando esas filas se modifican después.
Suma, extremos y media
| Expresión | Resultado |
|---|---|
sum([4, 8, 15]) | 27 |
min([4, 8, 15]) | 4 |
max([4, 8, 15]) | 15 |
sum([]) | 0 |
sum() suma números. No une cadenas; sum(["a", "b"]) lanza TypeError. min() y max() encuentran los elementos menor y mayor, por lo que los elementos deben admitir comparaciones entre sí. Las listas formadas solo por cadenas funcionan: max(["pear", "apple"]) da 'pear' mediante el orden carácter a carácter. Una lista vacía no tiene mínimo ni máximo y lanza ValueError con cualquiera de las dos llamadas.
La media es la suma dividida entre el número de elementos:
temps = [18.5, 21.0, 19.5, 23.0]
if temps:
total = sum(temps)
mean = total / len(temps)
print(total, mean)
Salida:
82.0 20.5
La condición funciona porque las listas vacías se consideran falsas y las no vacías, verdaderas. Sin la condición de protección, calcular la media de [] dividiría entre cero y lanzaría ZeroDivisionError. Elige qué debe hacer el programa cuando no haya lecturas, como devolver None.
Compara secuencias en orden
== comprueba que coincidan los elementos en las mismas posiciones. [1, 2, 3] == [1, 2, 3] es True; [1, 2, 3] == [3, 2, 1] es False.
Para < y >, compara desde la izquierda y detente en el primer par desigual. [2, 9] < [3, 0] es True porque 2 es menor que 3. El 9 y el 0 no deciden nada. Cuando una lista es el comienzo de otra, la más corta va primero: [2] < [2, 0] es True.
Pasa entre texto y listas
colors = "red,green,blue".split(",")
print(colors)
print(", ".join(["red", "green"]))
Salida:
['red', 'green', 'blue']
red, green
split() divide una cadena por su separador. join() se llama sobre el separador y lo coloca entre las cadenas recibidas. Cada elemento debe ser una cadena. Para unir números, construye primero una lista de los resultados de aplicarles str(); pasar [1, 2] directamente a join() lanza TypeError.
Puntos clave
+une listas;*repite su secuencia de elementos.sum,minymaxproducen valores de resumen.- Comprueba si la lista está vacía antes de calcular una media o un extremo.
- La comparación de secuencias usa el orden de los elementos y el primer par desigual.
splitcrea fragmentos de texto;join, llamado sobre un separador, combina cadenas.
2Modifica una lista
Una lista de compras crece, una cola pierde su primer elemento y un precio registrado necesita una corrección. Python ofrece métodos de lista y asignaciones para estos cambios. La elección depende de si conoces un valor o una posición, de si necesitas un elemento o varios y de si necesitas conservar un elemento eliminado. Prestar atención al valor de retorno de un método evita que un cambio en la lista haga que su nombre pase a referirse por accidente a None.
2.1 Añade y elimina elementos de una lista
Las listas son mutables: un programa puede modificar su contenido después de crearlas. Un método pertenece a un objeto y se llama con un punto, como en cart.append("eggs"). Su efecto sobre la lista y su valor de retorno son dos cosas distintas.
Añade un elemento o varios
cart = ["milk"]
cart.append("eggs")
cart.extend(["tea", "jam"])
print(cart)
Salida:
['milk', 'eggs', 'tea', 'jam']
append(x) añade exactamente un elemento al final. Si x es una lista, toda esa lista se convierte en un único elemento anidado. Partiendo de ['milk', 'eggs'], cart.append(["tea", "jam"]) produce ['milk', 'eggs', ['tea', 'jam']], de longitud 3.
extend(iterable) añade por separado los elementos que aporta el iterable. Ampliar con ["tea", "jam"] hace que la longitud de la lista de compras sea 4. Ampliar con "ab" añade 'a' y 'b' por separado; usa append con la cadena para conservar 'ab' como un único elemento.
insert(i, x) añade un elemento antes de la posición actual i. Tras nums = [10, 30] y nums.insert(1, 20), la lista es [10, 20, 30]. Los elementos posteriores se desplazan a la derecha. insert(0, x) añade al principio; un índice más allá del final añade al final sin un error de índice.
Elimina por posición o por valor
| Operación | Usa | Devuelve |
|---|---|---|
items.pop() | Última posición | Elemento eliminado |
items.pop(i) | Posición i | Elemento eliminado |
items.remove(x) | Primer valor igual a x | None |
del items[i] | Posición i | Sin valor de retorno |
del items[start:stop] | Segmento de posiciones | Sin valor de retorno |
items.clear() | Lista completa | None |
Con nums = [10, 20, 30], last = nums.pop() guarda 30 y deja [10, 20]. Después, nums.pop(0) devuelve 10 y deja [20]. Una lista vacía o una posición no válida hace que pop() lance IndexError.
remove() recibe un valor. Con pets = ["cat", "dog", "cat"], pets.remove("cat") deja ['dog', 'cat']. Solo desaparece la primera coincidencia. Si el valor está ausente, remove() lanza ValueError. Usa una comprobación de pertenencia cuando pueda faltar. Para eliminar todos los elementos 'cat', usa:
while "cat" in pets:
pets.remove("cat")
Con [5, 0, 7], remove(0) elimina el valor 0 y deja [5, 7]; pop(0) elimina el valor de la posición 0 y da [0, 7]. El significado del argumento determina el método.
del puede eliminar un rango: partiendo de [5, 6, 7, 8], del nums[1] deja [5, 7, 8], y después del nums[0:2] deja [8]. clear() deja vacía la lista existente.
Ten claro el valor de retorno
append, extend, insert, remove y clear devuelven None. Escribe cart.append("tea") en una línea independiente. Escribir cart = cart.append("tea") hace que cart se refiera a None; una llamada posterior a cart.append("jam") lanza AttributeError. Guarda el resultado de un método solo cuando aporte un valor que el programa necesite, como hace last = cart.pop().
Puntos clave
appendañade un elemento;extendañade cada elemento recibido.insertañade antes de una posición y desplaza los elementos posteriores.popelimina por posición y devuelve el elemento.removeelimina el primer valor igual y falla si está ausente.delelimina posiciones o segmentos;clearvacía la misma lista.- Los métodos como
appenddevuelvenNone, así que no vuelvas a asignar ese resultado a la lista.
2.2 Busca valores y sustituye elementos
Encontrar un valor, contarlo y sustituirlo son operaciones distintas. Usa una comprobación de pertenencia cuando necesites una respuesta de sí o no, un método de búsqueda cuando necesites una posición y una asignación cuando quieras modificar la lista.
Encuentra la primera posición coincidente
days = ["Mon", "Tue", "Wed", "Tue"]
print(days.index("Tue"))
print(days.index("Tue", 2))
print(days.count("Tue"))
print(days.count("Sun"))
Salida:
1
3
2
0
index(x) devuelve la primera posición que contiene un valor igual a x. Su argumento de inicio opcional indica a Python dónde empezar a buscar. days.index("Tue", 2) omite la coincidencia de la posición 1 y encuentra la de la posición 3. La respuesta sigue siendo un índice de la lista completa, no un recuento desde el nuevo punto de inicio.
index() lanza ValueError cuando el valor está ausente. Las listas no tienen un método find() que devuelva -1. Si se prevé que un valor pueda faltar, comprueba primero la pertenencia:
if "Sun" in days:
position = days.index("Sun")
print(position)
Este código no muestra nada porque 'Sun' está ausente. count(x) puede usarse sin esa protección: devuelve 0 cuando no hay coincidencias. Estas operaciones usan la igualdad, por lo que [1, 2.0].count(2) es 1. El texto sigue distinguiendo mayúsculas de minúsculas: 'tue' no es igual a 'Tue'.
Sustituye un elemento existente
prices = [4.5, 3.0, 7.25]
prices[1] = 3.5
print(prices)
Salida:
[4.5, 3.5, 7.25]
El segundo valor anterior se sobrescribe y la longitud sigue siendo 3. El índice debe existir: prices[3] = 1.0 lanza IndexError. Para añadir al final, usa append().
| Sentencia | Efecto sobre [10, 20] |
|---|---|
nums[0] = 99 | [99, 20] |
nums.insert(0, 99) | [99, 10, 20] |
La sustitución usa una posición existente. La inserción crea una posición adicional antes de la posición seleccionada.
Sustituye un rango mediante asignación a un segmento
nums = [1, 2, 3, 4, 5]
nums[1:3] = [20, 30, 40]
print(nums)
nums[0:2] = []
print(nums)
Salida:
[1, 20, 30, 40, 4, 5]
[30, 40, 4, 5]
La primera asignación sustituye los dos elementos de los índices 1 y 2 por tres elementos nuevos, aumentando la longitud de la lista en uno. Un segmento contiguo ordinario puede sustituirse por una secuencia más corta o más larga. Asignar [] elimina el rango seleccionado. Esto modifica la lista original; es distinto de leer un segmento y guardarlo en una variable nueva.
Edita texto construyendo texto nuevo
Una cadena es inmutable, por lo que word = "cat" seguido de word[0] = "b" lanza TypeError. Construye una cadena nueva con word = "b" + word[1:], o crea una lista de caracteres, modifícala y únela:
letters = list("cat")
letters[0] = "b"
word = "".join(letters)
print(word)
Salida:
bat
Puntos clave
indexdevuelve la primera posición coincidente y lanzaValueErrorsi falta el valor.countdevuelve el número de elementos iguales, incluido cero.- La asignación a un elemento sustituye una posición que ya existe.
- La asignación a un segmento contiguo puede cambiar la longitud de una lista.
- Las cadenas deben reconstruirse en lugar de modificarse mediante asignación a un elemento.
3Procesa listas con bucles
Los bucles convierten una colección almacenada en resultados útiles: una suma, una posición coincidente, una lista filtrada o una tabla modificada. Cada tarea empieza por elegir qué se irá manteniendo a lo largo del bucle y qué información necesita este de cada elemento. Algunas tareas solo necesitan valores; otras necesitan posiciones o registros emparejados. Las listas anidadas añaden otro nivel que seguir, por lo que procesar una tabla implica recorrer sus filas y después sus celdas.
3.1 Recorre elementos y posiciones
Un bucle puede usar los valores de una lista, sus posiciones o ambos. Elige la forma que aporte lo que necesita el cuerpo del bucle. Para modificar la lista, comprueba también si la sentencia cambia un elemento o solo revincula un nombre local.
Usa los elementos directamente
for name in ["Ana", "Ben"]:
print("Hi", name)
Salida:
Hi Ana
Hi Ben
El bucle recorre cada elemento en orden. En cada iteración, name hace referencia al elemento actual. Asignar un valor diferente a name no sustituye ese elemento en la lista. En for r in readings: r = 0, solo cambia el nombre r.
Usa posiciones para sustituir elementos
readings = [3, -1, 4, -5]
for i in range(len(readings)):
if readings[i] < 0:
readings[i] = 0
print(readings)
Salida:
[3, 0, 4, 0]
range(len(readings)) proporciona 0, 1, 2 y 3. En el índice 1, la condición es verdadera, por lo que la asignación al elemento sustituye -1. En el índice 3, sustituye -5. Las lecturas positivas conservan sus valores. Usar range(len(readings) + 1) también llegaría al índice 4, que no existe.
Obtén una posición y un elemento juntos
enumerate() proporciona pares. Desempaqueta cada par en la cabecera del bucle:
for i, name in enumerate(["Ana", "Ben"]):
print(i, name)
Salida:
0 Ana
1 Ben
enumerate(names, start=1) proporciona etiquetas que empiezan en 1 para una presentación numerada. Esas etiquetas ya no son los índices de la lista basados en cero. Para recorrer del último al primero sin modificar la lista, usa for item in reversed(names):. Para índices hacia atrás, usa range(len(names) - 1, -1, -1); una lista de tres elementos da 2, 1, 0.
Empareja dos listas
names = ["Ana", "Ben"]
scores = [90, 85]
for name, score in zip(names, scores):
print(name, score)
Salida:
Ana 90
Ben 85
zip() empareja elementos de las mismas posiciones y se detiene en la entrada más corta. Si todos los registros importan, comprueba las longitudes antes de usarlo; de lo contrario, se omitirá un nombre final sin pareja.
Controla un índice con while
Un bucle while necesita un índice inicial, una comprobación de límites y un paso:
i = 0
while i < len(readings):
print(readings[i])
i += 1
Olvidar el incremento impide que este bucle termine. Usar <= llega a len(readings) y provoca IndexError.
Evita desplazar elementos durante un bucle for
Eliminar elementos cambia las posiciones de los que vienen después. Con [1, 2, 2, 3], eliminar cada 2 encontrado mientras se recorre esa misma lista deja [1, 2, 3]: el segundo 2 se desplaza a la posición recién visitada. Recorre nums[:] si las eliminaciones deben afectar a la original, o construye una lista nueva con los elementos que quieras conservar. Añadir elementos a la lista que se está recorriendo también puede hacer que el bucle se comporte de forma inesperada.
Puntos clave
- Usa un bucle directo para los elementos,
range(len(...))para las posiciones yenumeratepara ambos. - Revincular la variable del bucle no sustituye un elemento de la lista.
zipse detiene en la entrada más corta.reversedrecorre hacia atrás sin modificar la lista.- Un bucle
whiledebe avanzar su índice y detenerse antes delen(values). - Construye una lista nueva o recorre una copia cuando elimines elementos.
3.2 Construye sumas, búsquedas y listas nuevas
Muchos problemas con listas usan unos pocos patrones de bucle reutilizables. Decide qué resultado necesita el programa, inicialízalo antes del bucle y actualízalo a medida que llegue cada elemento.
Acumula una suma o un recuento
sales = [120, 75, 205, 50]
total = 0
for sale in sales:
total += sale
print(total)
Salida:
450
La suma acumulada pasa a ser 120, 195, 400 y 450. Establecer total = 0 dentro del bucle borraría el trabajo anterior en cada iteración. sum(sales) realiza esta suma directamente.
Un contador suma 1 por cada elemento que cumple la condición, no el valor del elemento:
scores = [72, 45, 60, 88, 59]
passed = 0
for score in scores:
if score >= 60:
passed += 1
print(passed)
La salida es 3: 72, 60 y 88 cumplen la condición. > 60 daría 2 porque excluye exactamente 60. Mantén la redacción del umbral y la comparación en consonancia.
Encuentra un extremo
Para una lista no vacía, inicializa el máximo hasta el momento a partir de un elemento real:
temps = [-3, -8, -1, -5]
highest = temps[0]
for temp in temps[1:]:
if temp > highest:
highest = temp
print(highest)
La salida es -1. Empezar en 0 mantendría incorrectamente 0 porque todas las lecturas son menores. Usa < para encontrar el mínimo, o usa las funciones incorporadas min() y max(). Comprueba si la lista está vacía antes de acceder a su primer elemento.
Detente en la primera coincidencia
values = [4, 0, -2, 5, -7]
position = -1
for i, value in enumerate(values):
if value < 0:
position = i
break
print(position)
La salida es 2. -1 es una señal elegida para indicar que no hay coincidencia; no la uses como índice salvo que la búsqueda haya tenido éxito, porque también es un índice válido para el último elemento. break conserva la primera posición coincidente. Sin él, las coincidencias posteriores sobrescribirían el resultado.
x in values comprueba un valor exacto, y values.index(x) encuentra su primera posición. Una condición como «es negativo» necesita una búsqueda basada en una condición, como el bucle anterior.
Filtra o transforma
Un filtro conserva elementos originales seleccionados:
passing = []
for score in scores:
if score >= 60:
passing.append(score)
print(passing)
La salida es [72, 60, 88]; scores conserva los cinco elementos. Una transformación calcula un elemento nuevo a partir de cada original:
nums = []
for text in ["3", "14", "15"]:
nums.append(int(text))
print(nums, sum(nums))
La salida es [3, 14, 15] 32. La conversión ocurre antes de la suma; sumar las cadenas originales falla.
Devuelve un resultado reutilizable
def average(values):
if not values:
return None
return sum(values) / len(values)
average([18.5, 21.0, 19.5, 23.0]) devuelve 20.5. El caso vacío devuelve None sin dividir entre cero, y la función deja la lista de entrada sin cambios.
Puntos clave
- Inicializa un acumulador antes del bucle.
- Un contador suma 1 por coincidencia; una suma acumulada añade valores.
- Inicializa el extremo hasta el momento con un elemento real.
- Usa
breakpara conservar la primera coincidencia de una búsqueda. - El filtrado selecciona elementos; la transformación calcula valores nuevos.
- Una función que devuelve un valor permite al código que la llama conservar un resultado sin modificar la entrada.
3.3 Lee y procesa una tabla de filas
Una lista anidada es una lista que contiene otras listas. Una tabla suele usar una lista interna por fila. Cada acceso selecciona un nivel, por lo que leer una celda requiere dos índices.
Selecciona la fila y después la celda
grid = [[1, 2, 3], [4, 5, 6]]
print(grid[1])
print(grid[1][2])
print(len(grid), len(grid[0]))
Salida:
[4, 5, 6]
6
2 3
grid[1] selecciona la segunda fila; después, [2] selecciona el tercer elemento de esa fila. len(grid) cuenta filas, mientras que len(grid[0]) cuenta celdas de la primera fila. Esta tabla rectangular tiene seis celdas. grid[2][1] falla en el primer acceso porque la fila 2 no existe. Intercambiar las posiciones de fila y columna puede seleccionar la celda equivocada o lanzar IndexError.
Modifica una celda o una fila completa
grid[0][1] = 20 modifica la segunda celda de la primera fila y da [[1, 20, 3], [4, 5, 6]]. grid[0] = [0, 0, 0] sustituye toda la primera fila. El número de accesos indica qué nivel se está sustituyendo.
Recorre todos los valores
grid = [[1, 2, 3], [4, 5, 6]]
total = 0
for row in grid:
for value in row:
total += value
print(total)
Salida:
21
El bucle interno completa la primera fila antes de que el externo proporcione la segunda. Suma 1, 2, 3 y después 4, 5, 6. La suma de una columna usa una posición fija de cada fila:
column_total = 0
for row in grid:
column_total += row[1]
print(column_total)
La salida es 7, a partir de 2 y 5. Este código requiere que cada fila tenga un segundo elemento.
Las filas no tienen por qué tener la misma longitud. [[1], [2, 3]] es una lista anidada válida. Los bucles anidados directos siguen recorriendo todos los valores porque cada bucle interno sigue su propia fila. Suponer que todas las filas tienen len(grid[0]) elementos omitiría valores aquí. Para contar las celdas de una tabla así, suma len(row) para cada fila.
Construye filas independientes
table = []
for r in range(3):
table.append([0] * 4)
table[0][0] = 1
print(table)
Salida:
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Cada iteración crea una lista nueva de cuatro elementos. El atajo [[0] * 4] * 3 repite una referencia a una fila; modificar su primera celda se reflejaría en las tres filas.
Almacena registros
Una fila puede describir un registro en lugar de una fila de números. Con students = [["Ana", 90], ["Ben", 85]], students[1][0] es 'Ben' y students[1][1] es 85. Cuando cada registro tiene dos elementos, for name, score in students: los desempaqueta en nombres útiles. Las listas de tuplas pueden representar el mismo tipo de registros.
Puntos clave
- Dos índices seleccionan una fila y después una celda de esa fila.
len(grid)cuenta filas; las longitudes de las filas pueden diferir.- Los bucles anidados procesan cada fila con su propio bucle interno.
- Acceder a una columna requiere que esa posición exista en cada fila seleccionada.
- Crea cada fila mutable por separado para evitar celdas compartidas.
4Usa tuplas y desempaquetado
Los grupos fijos de valores suelen tener posiciones con significado: un punto tiene coordenadas y un registro de resultados tiene un nombre y una puntuación. Las tuplas mantienen fijas esas posiciones, mientras que el desempaquetado da a cada valor un nombre útil. Estas herramientas también explican cómo una asignación puede intercambiar dos valores y cómo una función puede devolver varios resultados. Una tupla externa inmutable puede contener una lista modificable, así que sigue tanto el contenedor como los objetos de su interior.
4.1 Elige una lista o una tupla
Una tupla almacena elementos en orden, como una lista, pero sus posiciones no pueden sustituirse, añadirse ni eliminarse. Esto es la inmutabilidad. Las tuplas son adecuadas para grupos fijos, como coordenadas, fechas y registros; las listas, para colecciones que crecen o cambian.
Crea y lee una tupla
point = (3, 4)
date = (2024, 7, 15)
print(date[0])
print(date[1:])
print(len(date))
Salida:
2024
(7, 15)
3
El acceso por índice, los índices negativos, los segmentos y la pertenencia en tuplas siguen las mismas reglas que en listas. Un segmento de tupla devuelve una tupla. Puedes recorrer una tupla con un bucle o usar +, *, min, max, sum, count e index cuando sus elementos sean adecuados para la operación.
La coma crea una tupla no vacía. t = 3, 4 crea (3, 4) incluso sin paréntesis. Una tupla de un elemento necesita una coma final:
| Expresión | Valor y tipo |
|---|---|
(5) | Entero 5 |
(5,) | Tupla de un elemento (5,) |
() | Tupla vacía |
tuple([1, 2]) | Tupla (1, 2) |
tuple("ab") | Tupla ('a', 'b') |
list(t) convierte los elementos de una tupla en una lista modificable.
Comprende qué no puede cambiar
point[0] = 5 lanza TypeError porque una tupla no admite la asignación a un elemento. Las tuplas no tienen métodos append, remove ni sort; point.append(5) lanza AttributeError.
Un nombre sí puede revincularse a una tupla nueva:
point = (3, 4)
point = (5,) + point[1:]
print(point)
La salida es (5, 4). La expresión crea una tupla nueva; no edita la anterior.
Una tupla puede contener un elemento mutable
t = ([1, 2], "x")
t[0].append(3)
print(t)
Salida:
([1, 2, 3], 'x')
La primera posición sigue conteniendo la misma lista. El contenido de esa lista ha cambiado. t[0] = [9] sustituiría el objeto de la posición y no está permitido. La inmutabilidad de la tupla externa no inmoviliza una lista interna.
Ajusta la estructura a su tarea
Usa (x, y) para unas coordenadas, (255, 128, 0) para un color RGB o ("Ana", 90) para un registro de dos campos. Cada posición tiene un significado concreto. Usa una lista para todas las puntuaciones de la clase o los artículos de una lista de compras, que pueden aumentar y reordenarse. Una lista de tuplas, como [("Ana", 90), ("Ben", 85)], combina una colección modificable con posiciones fijas en los registros.
Una tupla de números o cadenas puede servir como clave de diccionario, como en {(0, 0): "origin"}. Las claves deben ser aptas para hash (hashable), lo que significa que admiten las reglas estables de consulta por clave de Python. Una lista no es apta para hash, y una tupla que contiene una lista tampoco lo es.
Compara tuplas
La comparación empieza por la izquierda y se detiene en el primer par desigual. (1, 2, 5) < (1, 3, 0) es True: los primeros valores empatan y 2 es menor que 3. Esta misma regla ordena una lista de registros en forma de tupla cuando no se proporciona una función de clave de ordenación.
Puntos clave
- Una tupla tiene posiciones de elementos fijas, pero puede contener un objeto mutable.
- La coma crea una tupla no vacía;
(5,)tiene un elemento. - Las operaciones de lectura de tuplas siguen las reglas de las secuencias.
- Revincular el nombre de una tupla crea un valor diferente sin editar la tupla anterior.
- Las tuplas usadas como claves de diccionario necesitan contenido apto para hash.
- La comparación de tuplas usa el primer par de elementos desiguales.
4.2 Desempaqueta registros en nombres
El empaquetado reúne valores en una tupla. El desempaquetado asigna los elementos de un iterable a nombres en orden. Juntos permiten dar nombres claros a los campos de un registro y recibir varios resultados de una función.
Asocia nombres con valores
record = "Ana", 34, "Lima"
name, age, city = record
print(name, age, city)
Salida:
Ana 34 Lima
El primer elemento pasa a ser name, el segundo age y el tercero city. El desempaquetado también funciona con listas y cadenas: first, second = [10, 20] y a, b, c = "xyz" asignan sus elementos en orden. user, domain = "ana@example.com".split("@") da 'ana' y 'example.com' porque la división produce dos partes.
Sin un nombre precedido de asterisco, las cantidades deben coincidir exactamente. x, y = (1, 2, 3) lanza ValueError por exceso de valores; x, y, z = (1, 2) lanza ValueError porque faltan valores. Python no descarta los elementos sobrantes sin avisar.
Intercambia valores de forma segura
a = 1
b = 2
a, b = b, a
print(a, b)
La salida es 2 1. Python evalúa todo el lado derecho con los valores anteriores antes de asignar cualquiera de los nombres de la izquierda. El intento con dos sentencias, a = b seguido de b = a, pierde el valor anterior de a y hace que ambos nombres valgan 2.
Recoge los elementos restantes
Un nombre precedido de asterisco recibe una lista con los valores sobrantes:
first, *rest = [5, 6, 7, 8]
print(first, rest)
*init, last = [5, 6, 7, 8]
print(init, last)
Salida:
5 [6, 7, 8]
[5, 6, 7] 8
El asterisco también puede aparecer entre nombres sin asterisco: first, *middle, last = (5, 6, 7, 8) da a middle la lista [6, 7]. El objeto recogido siempre es una lista, incluso al desempaquetar una tupla. head, *rest = [5] deja rest como []. Debe haber suficientes elementos para los nombres sin asterisco, y solo se permite un nombre con asterisco en el mismo patrón de desempaquetado.
Desempaqueta durante un bucle
for name, score in [("Ana", 90), ("Ben", 85)]:
print(name, score)
Salida:
Ana 90
Ben 85
La cabecera desempaqueta cada registro a medida que llega. Así funcionan también for i, item in enumerate(values): y for a, b in zip(left, right):: cada iteración proporciona un par.
Devuelve varios resultados
def min_max(values):
return min(values), max(values)
low, high = min_max([7, 2, 9])
result = min_max([7, 2, 9])
print(low, high)
print(result)
Salida:
2 9
(2, 9)
La función devuelve una tupla. El código que la llama puede desempaquetarla o conservar el objeto completo. Por convención, un guion bajo da nombre a un valor que el código no necesita: _, month, day = (2024, 7, 15) conserva el mes y el día bajo nombres descriptivos. _ sigue siendo una variable normal, no una operación especial de descarte.
Puntos clave
- El empaquetado reúne valores; el desempaquetado los asigna en orden.
- Los nombres sin asterisco requieren una cantidad exacta de elementos.
- Un nombre precedido de asterisco recibe una lista con los valores sobrantes, que puede estar vacía.
- Intercambia con
a, b = b, apara conservar ambos valores anteriores. - Los valores de retorno múltiples suelen empaquetarse en una tupla.
5Sigue los objetos compartidos y crea copias
Dos nombres pueden hacer referencia a una lista, y una lista externa copiada puede seguir compartiendo sus filas. Estas relaciones explican por qué una modificación a veces aparece en más de un lugar. Sigue a qué objeto accede un nombre antes de decidir si una operación modifica ese objeto o revincula el nombre. El mismo razonamiento se aplica cuando una función recibe una lista y cuando un argumento predeterminado se reutiliza entre llamadas. Las copias aportan independencia en los niveles que la necesitan.
5.1 Sigue los nombres que comparten una lista
Una variable es un nombre que hace referencia a un objeto. La asignación cambia a qué se refiere un nombre; no copia automáticamente el objeto. Por tanto, con una lista mutable, dos nombres pueden observar los mismos cambios.
Sigue las referencias
a = [1, 2, 3]
b = a
b.append(4)
print(a)
print(b)
Salida:
[1, 2, 3, 4]
[1, 2, 3, 4]
Hay una lista y dos nombres para ella. b es un alias de a. La operación append modifica el objeto compartido, por lo que leerlo mediante cualquiera de los nombres muestra el elemento añadido. Dibuja dos flechas, una desde cada nombre, hacia la misma lista al seguir este código.
Distingue la igualdad de la identidad
a = [1, 2]
b = a
c = [1, 2]
print(a == b, a == c)
print(a is b, a is c)
Salida:
True True
True False
== compara contenidos; is comprueba si los objetos son el mismo objeto. c tiene el mismo contenido, pero es una lista independiente. id(x) da el número de identidad de un objeto, por lo que id(a) == id(b) coincide con a is b. Los números de identidad no indican qué elementos contiene una lista.
Usa == para comprobar si los contenidos coinciden. Usa is para comprobar si se comparte un objeto o si se trata de un objeto especial como None. Un literal de lista nuevo crea una lista independiente, por lo que a is [1, 2] es falso para una lista existente a, aunque su contenido coincida.
La mutación y la revinculación tienen distinto alcance
| Sentencia | ¿Qué cambia? | ¿Qué ve un alias? |
|---|---|---|
b.append(4) | Lista existente | Elemento añadido |
b[0] = 9 | Lista existente | Elemento sustituido |
b = [7, 8] | El nombre b | Lista original sin cambios |
Tras la última sentencia, b apunta a una lista nueva. a sigue haciendo referencia al objeto original. Revincular un nombre no redirige todos los nombres que antes se referían a ese objeto.
Sigue += y + por separado
Para las listas, += amplía la lista existente:
a = [1]
b = a
a += [2]
print(a, b)
La salida es [1, 2] [1, 2]. En cambio:
a = [1]
b = a
a = a + [2]
print(a, b)
La salida es [1, 2] [1]. + crea una lista nueva, y la asignación hace que a se refiera a ella. b sigue refiriéndose a la lista original de un elemento.
Busca alias menos visibles
row = [0, 0] seguido de table = [row, row] almacena la misma fila dos veces. table[0][0] = 5 produce [[5, 0], [5, 0]] porque ambas posiciones acceden a la misma lista interna.
Los números y las cadenas no pueden modificarse sobre el objeto original. Tras x = 5, y = x, x += 1, y sigue siendo 5; x se ha revinculado. Las posiciones de los elementos de una tupla también permanecen fijas, pero una lista interna puede cambiar. Tras t = ([1], 2), u = t y t[0].append(3), u muestra ([1, 3], 2): ambos nombres siguen accediendo a la misma tupla y a su misma lista mutable.
Puntos clave
- La asignación comparte una referencia; no copia una lista.
==compara valores, mientras queiscomprueba la identidad del objeto.- La mutación es visible mediante los alias; la revinculación redirige un nombre.
- Para las listas,
+=modifica el objeto original, mientras que+crea una lista nueva. - Los objetos pueden compartirse dentro de una tabla o tupla, además de entre nombres de variables.
5.2 Copia los niveles que necesiten independencia
Copiar crea un objeto nuevo, pero la profundidad de esa copia importa. Una lista externa nueva puede seguir conteniendo referencias a las listas internas originales.
Crea una lista externa nueva
a = [1, 2, 3]
b = a.copy()
b.append(4)
print(a)
print(b)
print(a is b)
Salida:
[1, 2, 3]
[1, 2, 3, 4]
False
a[:], list(a) y a.copy() crean una copia superficial de una lista. Su contenedor externo es nuevo y se copian las referencias a sus elementos. Con números o cadenas inmutables, sustituir o añadir un elemento en una lista externa deja la otra sin cambios.
Observa qué comparte una copia superficial
a = [[1, 2], [3, 4]]
b = a.copy()
b[0].append(99)
print(a)
print(b is a, b[0] is a[0])
Salida:
[[1, 2, 99], [3, 4]]
False True
Las dos listas externas son distintas, pero sus primeros elementos hacen referencia a la misma lista interna. append() modifica ese objeto interno.
Sustituir una posición de b es diferente. Tras b[1] = [0], b tiene una segunda fila diferente, mientras que a[1] sigue siendo [3, 4]. La asignación cambia una referencia de la lista externa de b; no modifica la segunda fila anterior.
Copia también las listas anidadas
import copy
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
b[0].append(99)
print(a)
print(b)
Salida:
[[1, 2], [3, 4]]
[[1, 2, 99], [3, 4]]
import copy hace que el módulo de copias esté disponible. copy.deepcopy() copia de forma recursiva la estructura de listas anidadas, por lo que las modificaciones de las listas internas copiadas no llegan a la original. Úsalo cuando los cambios en esos niveles internos deban ser independientes. Una copia superficial basta si solo van a cambiar el orden de la lista externa o sus referencias a elementos.
Evita referencias repetidas al construir filas
table = [[0] * 3] * 2
table[0][0] = 7
print(table)
La salida es [[7, 0, 0], [7, 0, 0]]. La multiplicación repitió la referencia a una fila. No construyó dos filas.
Construye cada fila dentro del bucle:
table = []
for r in range(2):
table.append([0] * 3)
table[0][0] = 7
print(table)
La salida es [[7, 0, 0], [0, 0, 0]]. [0] * 3 por sí solo es seguro para contadores independientes: los enteros no pueden modificarse y la asignación a un elemento sustituye solo una posición.
Elige una copia por una razón
Conservar el orden original antes de ordenar requiere una lista externa nueva. Conservar las mediciones anidadas originales mientras se modifican celdas copiadas requiere también listas internas independientes. El procesamiento de solo lectura no necesita copias, y la edición compartida intencionada puede usar alias. Para investigar un error de programación en una estructura anidada, comprueba tanto b is a como b[0] is a[0]; comprobar solo las listas externas no detecta los objetos internos compartidos.
Puntos clave
- Los segmentos,
list()ycopy()crean una lista externa nueva. - Una copia superficial conserva referencias a los elementos originales.
- Sustituir una fila copiada es distinto de modificar una fila compartida.
copy.deepcopycopia las listas anidadas de forma recursiva.- La multiplicación de listas anidadas repite referencias a una fila.
- Copia solo los niveles cuyos cambios deban ser independientes.
5.3 Aclara los efectos de una función sobre una lista
Un parámetro de función es otro nombre para el objeto que proporciona el código que la llama. Un argumento de tipo lista no se copia automáticamente. La función puede modificar ese objeto, revincular su parámetro local o devolver un resultado nuevo; estas acciones afectan de formas distintas al código que realiza la llamada.
La mutación afecta al código que llama
def add_bonus(scores):
scores.append(5)
marks = [80]
result = add_bonus(marks)
print(marks)
print(result)
Salida:
[80, 5]
None
scores y marks hacen referencia inicialmente a la misma lista. Añadir un elemento mediante scores la modifica. Como la función no tiene una sentencia de retorno explícita, su resultado es None.
En cambio, def reset(scores): scores = [] revincula solo el parámetro local. La variable marks del código que llama sigue haciendo referencia a su lista anterior. Usa scores.clear() para vaciar esa lista compartida.
Conserva una lista devuelta cuando la necesites
Dos diseños habituales son modificar la lista original y devolver None, o dejarla intacta y devolver una lista nueva:
def drop_first(values):
del values[0]
def tail(values):
return values[1:]
Para nums = [1, 2, 3], llamar a drop_first(nums) deja nums como [2, 3]. En cambio, escribir nums = drop_first(nums) vincularía nums a None. Empezando de nuevo con [1, 2, 3], shorter = tail(nums) da a shorter la lista [2, 3], mientras que nums queda sin cambios. Llamar a tail(nums) sin conservar su resultado descarta la lista nueva.
Otros diseños también son útiles: sum() devuelve un resumen, y pop() modifica una lista y devuelve un elemento. Deja claros el efecto y el valor de retorno en el nombre o la cadena de documentación de la función.
Construye un resultado sin modificar la entrada
def without_negatives(values):
kept = []
for value in values:
if value >= 0:
kept.append(value)
return kept
original = [3, -2, 0, 7]
print(without_negatives(original))
print(original)
Salida:
[3, 0, 7]
[3, -2, 0, 7]
El código que llama también puede proteger su lista externa pasando una copia superficial, como drop_first(original[:]). Una operación que edite listas internas necesitaría copiar también esos niveles.
Evita un valor predeterminado mutable compartido
def add_item(item, basket=[]):
basket.append(item)
return basket
La lista predeterminada se crea una vez, cuando se ejecuta la sentencia def. add_item("a") devuelve ['a'], y la siguiente llamada que usa el valor predeterminado, add_item("b"), devuelve ['a', 'b']. Usa None para solicitar una lista nueva:
def add_item(item, basket=None):
if basket is None:
basket = []
basket.append(item)
return basket
Ahora cada llamada sin una cesta crea su propia lista. Pasar una cesta existente sigue permitiendo cambios compartidos intencionados. Una función no puede modificar un número o una cadena, ni sustituir las posiciones de una tupla, pero sí puede modificar una lista almacenada en una tupla, por ejemplo, llamando a pair[0].append(9).
Puntos clave
- Un parámetro hace referencia inicialmente al objeto del código que llama.
- Modificar un parámetro de tipo lista cambia ese objeto; revincular el parámetro no lo cambia.
- Conserva una lista nueva devuelta si el programa la necesita.
- Comprueba tanto el efecto de una función como su valor de retorno.
- Una lista predeterminada mutable se comparte entre las llamadas que usan el valor predeterminado.
- Usa
Noney crea una lista dentro de la función para obtener un valor predeterminado nuevo.
6Ordena secuencias
Ordenar registros requiere dos decisiones: qué valores determinan el orden y si debe modificarse la colección original. Python puede ordenar la lista original o devolver una lista nueva a partir de cualquier iterable. Las funciones de clave de ordenación permiten comparar un campo, un valor calculado o varios campos en secuencia. Las claves iguales conservan su orden de entrada, lo que hace predecibles los empates y permite ordenar según más de una regla.
6.1 Elige cómo ordenar o invertir datos
Ordenar coloca los elementos según su orden de comparación. Invertir da la vuelta a su orden actual. Decide también si el programa debe modificar la lista existente o conservarla y recibir una lista nueva.
Ordena la lista original o conserva una nueva
nums = [3, 1, 2]
new = sorted(nums)
print(nums)
print(new)
nums.sort()
print(nums)
Salida:
[3, 1, 2]
[1, 2, 3]
[1, 2, 3]
sorted() crea una lista nueva. sort() es un método de lista que reorganiza la lista existente y devuelve None. nums = nums.sort() pierde la referencia del nombre a la lista y lo vincula a None. Escribe nums.sort() en una línea independiente o usa nums = sorted(nums). print(nums.sort()) muestra None aunque la lista se haya reordenado.
sorted() acepta cualquier iterable y siempre devuelve una lista. sorted((3, 1, 2)) da [1, 2, 3], y sorted("cab") da ['a', 'b', 'c']. Las cadenas y las tuplas no tienen un método sort() que modifique el objeto original.
Orden descendente y orden inverso
Expresión para nums = [3, 1, 2] | Resultado | ¿Modifica nums? |
|---|---|---|
sorted(nums, reverse=True) | [3, 2, 1] | No |
nums.sort(reverse=True) | Devuelve None; la lista pasa a ser [3, 2, 1] | Sí |
nums[::-1] | [2, 1, 3] | No |
list(reversed(nums)) | [2, 1, 3] | No |
nums.reverse() | Devuelve None; la lista pasa a ser [2, 1, 3] | Sí |
Cada fila parte de la lista original. reverse=True solicita un orden de comparación descendente y debe indicarse por nombre; sorted(nums, True) lanza TypeError. Invertir simplemente recorre las posiciones existentes hacia atrás, por lo que no produce necesariamente valores descendentes.
Comprueba los valores que se comparan
Los números se ordenan por su valor numérico, incluso al mezclar enteros y números de coma flotante: sorted([2.5, -1, 2]) da [-1, 2, 2.5].
El texto se compara carácter a carácter. sorted(["10", "9", "100"]) da ['10', '100', '9']. El primer carácter '1' se ordena antes que '9', y un prefijo de cadena va antes que una cadena más larga que empieza por él. Convierte las cadenas numéricas con int() o float() cuando quieras un orden numérico.
Las letras mayúsculas A–Z se ordenan antes que las minúsculas a–z. sorted(["b", "B", "a"]) da ['B', 'a', 'b']. El orden predeterminado de cadenas se basa en los códigos de los caracteres; no es un orden de diccionario sin distinción entre mayúsculas y minúsculas.
Todos los elementos comparados deben admitir < entre sí. sorted([3, "two", 1]) lanza TypeError. Limpia o convierte los datos antes de ordenar.
Usa las posiciones ordenadas
Para una cantidad impar de puntuaciones, ordenar permite leer fácilmente el valor central:
scores = [72, 95, 64, 88, 79]
ordered = sorted(scores)
median = ordered[len(ordered) // 2]
print(ordered)
print(median)
La salida es [64, 72, 79, 88, 95] seguida de 79. La lista original sigue registrando el orden en que llegaron las puntuaciones. Este cálculo basado en un único elemento central se aplica a listas no vacías de longitud impar.
Puntos clave
sortmodifica una lista y devuelveNone;sorteddevuelve una lista nueva.sortedacepta iterables como tuplas y cadenas.reverse=Trueordena de forma descendente; invertir solo da la vuelta a las posiciones actuales.- Las cadenas numéricas usan el orden del texto salvo que se conviertan.
- Los elementos deben admitir comparaciones entre sí.
6.2 Ordena registros por los campos relevantes
Una función de clave de ordenación calcula el valor de comparación de cada elemento. Los elementos originales permanecen intactos en el resultado ordenado. Esto permite ordenar texto por longitud o registros por un campo seleccionado.
Pasa una función, no una llamada a función
words = ["kiwi", "fig", "banana"]
print(sorted(words, key=len))
Salida:
['fig', 'kiwi', 'banana']
Python llama a len una vez por cada elemento y compara las longitudes resultantes, 4, 3 y 6. Pasa key=len, sin paréntesis. key=len() intenta llamar a len inmediatamente sin argumento y falla.
Para comparar en minúsculas, usa key=str.lower. Con ["banana", "apple", "Cherry"], el orden predeterminado es ['Cherry', 'apple', 'banana']. Con key=str.lower, el resultado es ['apple', 'banana', 'Cherry']. La C mayúscula original permanece en el resultado; solo las claves de comparación están en minúsculas.
Selecciona un campo del registro
results = [("Ana", 90), ("Ben", 72), ("Cy", 85)]
def by_score(record):
return record[1]
print(sorted(results, key=by_score))
Salida:
[('Ben', 72), ('Cy', 85), ('Ana', 90)]
La función recibe un registro cada vez. record[1] selecciona su puntuación. Añade reverse=True para colocar primero la puntuación más alta. results.sort(key=by_score, reverse=True) usa la misma regla, pero modifica la propia results.
key=by_score(results) es diferente: llama a la función sobre toda la lista y pasa su resultado como argumento de clave. Aquí ese resultado es la tupla ('Ben', 72), que no puede llamarse como función, por lo que la ordenación lanza TypeError.
Usa varios campos
Sin una clave, las tuplas comparan sus primeros elementos y después sus segundos elementos para deshacer empates entre los primeros. Ordenar [("Ben", 72), ("Ana", 90), ("Ana", 85)] da [('Ana', 85), ('Ana', 90), ('Ben', 72)].
Una clave puede devolver una tupla para elegir un orden de campos diferente:
def rank_key(record):
return (-record[1], record[0])
results = [("Dee", 85), ("Ana", 90), ("Cy", 85)]
print(sorted(results, key=rank_key))
Salida:
[('Ana', 90), ('Cy', 85), ('Dee', 85)]
Cambiar el signo de la puntuación hace que las puntuaciones mayores tengan claves menores. Después, los nombres deshacen los empates de puntuación en orden ascendente. reverse=True con una clave positiva (score, name) invertiría ambos campos, incluidos los nombres, por lo que no cumpliría esta regla de direcciones mixtas.
Conserva el orden de los elementos con claves iguales
La ordenación de Python es estable: los elementos con claves iguales conservan su orden de entrada. Ordenar ["bb", "a", "cc", "d"] por len da ['a', 'd', 'bb', 'cc']. El empate entre las dos palabras de una letra mantiene 'a' primero; el empate de dos letras mantiene 'bb' primero. La estabilidad también permite ordenar primero por un campo secundario y después por el principal.
min() y max() también aceptan funciones de clave de ordenación. max(words, key=len) devuelve 'banana', no su longitud. Cuando las claves empatan, estas funciones devuelven el primer elemento coincidente que encuentran.
Puntos clave
- Una función de clave de ordenación transforma un elemento en su valor de comparación.
- Pasa la función en sí, como
key=lenokey=by_score. - Los resultados de la clave controlan el orden sin sustituir los elementos originales.
- Una clave en forma de tupla ordena por su primer campo y después usa los siguientes para deshacer empates.
- Cambiar el signo de una clave numérica puede invertir solo la dirección de ese campo.
- La ordenación estable conserva el orden de entrada entre claves iguales.
minymaxdevuelven elementos originales y eligen el primero si hay empate de claves.
Ejemplos de Listas y tuplas en Python
1Lee los recuentos de entregas de una semana
13 pasos
- 1IntroducciónMantén los recuentos en orden
Un registro de entregas almacena un recuento por día. Una lista conserva el orden, por lo que una posición identifica un día y un segmento selecciona varios días. Después puedes calcular una suma o una media a partir de los valores seleccionados.
Trabaja con
deliveries = [12, 7, 15, 9, 17]. Son cinco recuentos diarios en orden de llegada. Sigue primero las posiciones, después los límites de los segmentos y, por último, el tipo de resultado que produce cada operación. - 2EjemploAsocia recuentos con posiciones
Los cinco recuentos ocupan los índices del 0 al 4:
deliveries = [12, 7, 15, 9, 17] print(deliveries[0], deliveries[4])La salida es
12 17.len(deliveries)es 5, pero el índice 5 no existe. Un recuento indica cuántas posiciones hay; no identifica la última. El recuento final también puede leerse comodeliveries[-1], usando un índice negativo desde el final. - 3ConsejoComprueba una lectura antes de usarla
La pertenencia responde a una pregunta distinta del acceso por índice:
print(9 in deliveries) print(4 in deliveries)La salida es
Truey despuésFalse. El valor 9 aparece, pero 4 no, aunque 4 sea un índice válido.incomprueba los valores almacenados. Si quieres el recuento de la posición 4, usadeliveries[4], que devuelve17. - 4DesafíoEncuentra el penúltimo recuento
¿Qué devuelve
deliveries[-2]? ¿Funcionaríadeliveries[len(deliveries)]?---reveal---
El índice negativo
-2selecciona9, una posición antes del elemento final17. La segunda expresión intenta acceder al índice 5 y lanza IndexError. Usalen(deliveries) - 1o-1para seleccionar el último elemento; el número de elementos supera en uno al último índice no negativo. - 5EjemploSelecciona los tres días centrales
Usa el índice 1 como inicio y el índice 4 como límite final excluido:
middle = deliveries[1:4] print(middle)La salida es
[7, 15, 9]. Lee las posiciones seleccionadas como 1, 2 y 3. La posición 4 contiene 17, pero aquí marca el límite de parada.middlees una lista nueva, por lo que modificar sus posiciones externas no sustituirá una posición dedeliveries. - 6ExplicaciónOmite un límite
deliveries[:2]da[12, 7], los dos primeros días.deliveries[2:]da[15, 9, 17], todos los días restantes. Ambos segmentos se unen en el límite 2, por lo que concatenarlos reconstruye el contenido original.deliveries[-2:]da[9, 17]. Un límite negativo cuenta desde el final.deliveries[20:]es[]: un límite de segmento fuera de rango se ajusta, a diferencia de un acceso a un elemento fuera de rango. - 7EjemploRecorre días alternos
Un tercer campo del segmento controla la separación:
print(deliveries[::2]) print(deliveries[::-1])La salida es
[12, 15, 17]y después[17, 9, 15, 7, 12]. El paso 2 visita los índices 0, 2 y 4. El paso -1 recorre todos los elementos hacia atrás. Ambos resultados son listas nuevas. Un paso de cero no puede avanzar y lanza ValueError. - 8DesafíoDistingue un recuento de una lista
¿Cuáles son los valores y tipos de
deliveries[2]ydeliveries[2:3]?---reveal---
deliveries[2]es el entero15.deliveries[2:3]es la lista[15]. El segmento selecciona una posición, pero sigue devolviendo una lista. Esta diferencia importa si la siguiente operación espera un recuento numérico: sumar 1 al entero funciona, mientras que sumar 1 directamente a la lista lanza TypeError. - 9EjemploCalcula una media a partir del segmento
El segmento central es
[7, 15, 9]. Suma sus elementos y divide entre su longitud:total = sum(middle) mean = total / len(middle) print(total) print(mean)La salida es
31y después10.333333333333334. La suma es 7 + 15 + 9, y el divisor es 3./produce un resultado de coma flotante, por lo que esta media se muestra con una aproximación decimal. - 10Idea claveGestiona una selección sin días
Un segmento puede estar vacío, por lo que una media necesita una condición de protección:
selected = deliveries[20:] if selected: print(sum(selected) / len(selected)) else: print("No days selected")Esto muestra
No days selected. Las listas vacías se consideran falsas. Aunquesum([])es 0, dividir esa suma entrelen([])dividiría entre cero.minymaxtambién fallan con estas entradas vacías. - 11ConexiónConstruye una línea de salida
La presentación necesita cadenas, no una lista de enteros:
pieces = [] for count in deliveries: pieces.append(str(count)) print(", ".join(pieces))La salida es
12, 7, 15, 9, 17.joinse llama sobre el separador y lo coloca entre los elementos. Pasar la lista numérica directamente fallaría porque cada elemento unido debe ser una cadena.splithace lo contrario: divide texto en fragmentos de cadena. - 12DesafíoSelecciona, suma y conserva el original
¿Qué muestra este código?
selected = deliveries[-3:] selected[0] = 0 print(sum(selected), deliveries[2])---reveal---
Muestra
26 15. El segmento empieza como[15, 9, 17]y después se sustituye su primera posición, dando[0, 9, 17]. Esos valores suman 26. La lista externa del segmento es independiente, por lo que el recuento original endeliveries[2]sigue siendo 15. - 13RepasoElige el resultado que necesitas
Lee una posición para obtener un recuento individual, usa un segmento para obtener una secuencia y usa funciones de resumen para sumas o extremos. Un segmento de lista crea una lista externa nueva.
Antes de calcular la media de una selección, gestiona el caso vacío. Al construir texto de salida, convierte los valores numéricos en cadenas antes de unirlos.
2Edita una solicitud de suministros
10 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónSigue la lista y el valor devuelto
- 2EjemploAñade un lote de artículos
- 3EjemploColoca un artículo al principio
- 4EjemploElimina y guarda un artículo recogido
- 5DesafíoElige una eliminación por valor
- 6EjemploEncuentra la posición que debes corregir
- 7EjemploSustituye un artículo por un lote
- 8DesafíoElimina un rango y encuentra un valor
- 9DesafíoFinaliza la solicitud sin perderla
- 10RepasoAsocia el cambio con la operación
3Limpia lecturas y suma los valores de una tabla
13 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDecide qué mantiene cada bucle
- 2ExplicaciónLee un valor sin editar su posición
- 3EjemploSustituye lecturas no válidas por índice
- 4ConexiónEmpareja etiquetas con lecturas
- 5DesafíoExplica un elemento omitido
- 6EjemploCuenta las lecturas positivas
- 7EjemploConstruye un resultado filtrado y transformado
- 8ConsejoBusca hasta la primera coincidencia
- 9DesafíoElige un máximo válido
- 10EjemploSelecciona una fila y una celda
- 11EjemploSuma todas las filas
- 12DesafíoFiltra en toda la tabla
- 13RepasoSepara la inicialización del trabajo repetido
4Usa un registro fijo y desempaqueta sus campos
10 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónMantén un registro unido
- 2EjemploCrea el registro de la estación
- 3Idea claveComprueba el límite de la inmutabilidad
- 4DesafíoCrea una tupla de un elemento
- 5EjemploDa un nombre a cada campo
- 6EjemploConserva la primera lectura y el resto
- 7DesafíoIntercambia valores de coordenadas
- 8EjemploDevuelve un par de extremos
- 9DesafíoLee y desempaqueta un campo seleccionado
- 10RepasoLee la estructura antes de desempaquetar
5Sigue una tabla copiada a través de una función
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDibuja rutas hacia los objetos
- 2EjemploCrea un alias
- 3EjemploRedirige un nombre
- 4DesafíoPredice dos tipos de suma
- 5EjemploCopia la tabla externa
- 6EjemploModifica una fila compartida
- 7Idea claveSustituye una fila copiada
- 8DesafíoElige una copia más profunda
- 9EjemploModifica mediante un parámetro
- 10ConexiónDevuelve una lista independiente
- 11ExplicaciónEvita una cesta predeterminada persistente
- 12DesafíoDistingue la revinculación local del vaciado
- 13DesafíoSigue una copia superficial pasada a una función
- 14RepasoSigue el nivel que se modifica
6Clasifica registros sin perder su orden de llegada
13 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDistingue los datos almacenados de las claves de comparación
- 2EjemploConserva el orden de llegada
- 3EjemploCompara la inversión con la ordenación descendente
- 4ConsejoComprueba el tipo de entrada
- 5DesafíoSigue el resultado de una ordenación
- 6EjemploElige una clave de puntuación
- 7Idea claveConserva el orden de llegada en los empates
- 8DesafíoPasa un objeto que pueda llamarse
- 9EjemploAñade un criterio de desempate alfabético
- 10ConsejoInvierte solo la dirección numérica
- 11ConexiónElige un elemento por una clave extrema
- 12DesafíoConserva la forma de los registros y los nombres
- 13RepasoElige el efecto y la regla
Ejercicios de Listas y tuplas en Python
Set 1: Lee, segmenta y modifica secuencias10 Preguntas de Práctica
Pregunta 1 de 10
levels = [14, 29, 37, 52], ¿cuál es el valor de levels[-2]?Mostrar respuestaOcultar respuesta
-1 selecciona 52, y -2 selecciona 37. Contar dos posiciones desde el principio daría 29, pero eso usa una dirección distinta. El signo menos cambia dónde empieza el conteo de posiciones.Pregunta 2 de 10
codes = [2, 5, 8, 11, 14, 17], ¿cuál es el valor de codes[1:5:2]?Mostrar respuestaOcultar respuesta
[5, 11]. Incluir 17 trataría el límite final como incluido; tomar todos los elementos entre los límites ignoraría el paso.Pregunta 3 de 10
¿Qué lista resulta de este código?
items = ["pen"]
items.append(["clip", "pad"])
Mostrar respuestaOcultar respuesta
append añade su argumento como un elemento, por lo que las dos cadenas permanecen juntas dentro de una lista anidada. La lista externa tiene ahora dos elementos: una cadena y una lista. Añadir las cadenas como elementos externos separados requeriría extend con la lista de dos elementos.Pregunta 4 de 10
¿Qué muestra este código?
parts = "6|12|18".split("|")
print(len(parts), parts[1])
Mostrar respuestaOcultar respuesta
'6', '12' y '18'. El índice 1 selecciona el segundo elemento, que se muestra como 12. Contar los caracteres de la cadena original confundiría el texto de entrada con la lista devuelta por split.Pregunta 5 de 10
¿Cuál es el valor de len(values) después de este código?
values = [4, 7, 10, 13]
values[1:3] = [20, 21, 22]
Mostrar respuestaOcultar respuesta
4 - 2 + 3, que es 5. Mantener la longitud original sería correcto para una asignación a un elemento, pero sustituir un segmento contiguo puede ampliar o reducir una lista.Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
(12,) es el valor requerido. Los paréntesis solos únicamente agrupan el entero, haciendo que (12) sea el mismo entero que 12. Los corchetes crean una lista, y tuple(12) falla porque un entero no puede proporcionar elementos iterables.Pregunta 7 de 10
¿Qué muestra este código?
queue = [18, 0, 24]
removed = queue.pop(0)
print(removed, queue)
Mostrar respuestaOcultar respuesta
pop(0) selecciona la posición 0, elimina su elemento 18 y lo devuelve. La lista restante es [0, 24]. Eliminar el valor 0 daría [18, 24], pero eso es lo que hace remove(0); pop interpreta su argumento como un índice.Pregunta 8 de 10
¿Qué muestra este código?
a = [3, 6, 9, 12, 15]
b = a[-4:-1]
print(b[::-1][1])
Mostrar respuestaOcultar respuesta
[6, 9, 12]. Invertir esa lista nueva da [12, 9, 6], cuyo índice 1 es 9. Seleccionar 6 leería el primer elemento del segmento original sin completar tanto la inversión como el acceso final.Pregunta 9 de 10
items = [9, 16, 25], ¿qué ocurre cuando Python evalúa items[len(items)]?Mostrar respuestaOcultar respuesta
len(items) es 3, pero los índices no negativos válidos son 0, 1 y 2. Acceder al índice 3 lanza IndexError porque no existe ningún elemento allí. La expresión proporciona un índice entero, así que el problema es su rango, no su tipo; items[-1] devolvería 25.Pregunta 10 de 10
[4, 99] < [5, 1]?Mostrar respuestaOcultar respuesta
4 < 5 es verdadero, por lo que la comparación termina ahí. El 99 posterior no altera ese resultado; Python no compara las sumas de las listas para esta operación.Set 2: Procesa valores, posiciones y tablas10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
¿Qué lista muestra este código?
values = [8, 3]
for value in values:
value = 0
print(values)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
¿Qué valor muestra este código?
count = 0
for size in [10, 7, 10, 13, 6]:
if size >= 10:
count += 1
print(count)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
table = [[6, 8, 10], [11, 13, 15]], ¿qué produce table[1][0] + table[0][2]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
list(zip(["Lee", "Mo", "Nia"], [41, 56]))?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué se muestra?
values = [7, -4, -8, 2]
position = -1
for i, value in enumerate(values):
if value < 0:
position = i
break
print(position, values[position])
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Cuántas veces se ejecuta total += value?
total = 0
for row in [[2, 4], [6], [8, 10, 12]]:
for value in row:
total += value
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué lista queda después de este código?
values = [0, 0, 1, 0]
for value in values:
if value == 0:
values.remove(value)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
[-14, -6, -19]. ¿Con qué debe inicializarse su máximo hasta el momento?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Qué muestra este código?
kept = []
for text in ["4", "15", "8", "21"]:
number = int(text)
if number % 2 == 0:
kept.append(number + 1)
print(kept)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué tabla resulta?
table = []
for r in range(2):
table.append([0] * 2)
table[1][0] = 6
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Desempaqueta registros y sigue objetos compartidos10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
label, amount = ("rice", 4), ¿qué valor contiene amount?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
middle después de first, *middle, last = (2, 5, 8, 11, 14)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
¿Qué muestra este código?
a = [5, 8]
b = [5, 8]
print(a == b, a is b)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
¿Qué muestra este código?
record = ([2], "ready")
other = record
record[0].append(7)
print(other)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué muestra este código?
a = [4]
b = a
a += [9]
a = a + [12]
print(a, b)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Qué muestra este código?
def bounds(values):
return min(values), max(values)
low, high = bounds([18, 5, 12])
low, high = high, low
print(low, high)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué muestra este código?
a = [2, 6]
b = a.copy()
b[0] = 10
print(a, b)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Qué muestra este código?
a = [[4], [8]]
b = a.copy()
b[0].append(6)
b[1] = [9]
print(a)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué muestra este código?
row = [1, 2]
table = [row, row]
row = [8, 9]
table[0][1] = 7
print(table, row)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Controla los cambios entre llamadas a funciones10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
tags = ["new", "old", "new"], ¿qué devuelve tags.count("done")?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
¿Qué muestra este código?
def reset(values):
values = []
values = [11, 22]
reset(values)
print(values)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
¿Qué muestra este código?
import copy
a = [[3], [7]]
b = copy.deepcopy(a)
b[0].append(5)
print(a, b[0] is a[0])
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
¿Qué muestra la última línea?
def collect(item, items=[]):
items.append(item)
return items
first = collect("x")
second = collect("y")
print(first is second, first)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué muestra este código?
def trim(values):
del values[0]
items = [6, 9, 12]
result = trim(items)
print(items, result)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Qué muestra este código?
def change(values):
values.append(8)
values = [0]
return values
original = [3]
result = change(original)
print(original, result)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué tabla resulta?
table = [[0] * 2] * 3
table[2][1] = 4
table[0] = [9, 9]
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
codes = ["q", "r", "q", "s", "q"], ¿cuál es el valor de codes.index("q", 1)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Qué se muestra?
def add(item, values=None):
if values is None:
values = []
values.append(item)
return values
a = add(4)
b = add(7)
c = add(9, a)
print(a, b, c is a)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué muestra este código?
def edit(rows):
rows[0].append(5)
rows.append([9])
original = [[1], [2]]
edit(original[:])
print(original)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Elige reglas de ordenación y resuelve empates10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
result después de nums = [8, 2, 5] y result = nums.sort()?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
sorted(["20", "3", "11"])?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
sorted(["pear", "a", "plum", "to"], key=len)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
values = [6, 1, 4], ¿qué par de resultados producen values[::-1] y sorted(values, reverse=True), en ese orden?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
(name, score). ¿Qué cuerpo de función de clave de ordenación coloca primero las puntuaciones más altas y los nombres de A a Z cuando las puntuaciones empatan?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Qué orden produce este código?
records = [("Zoe", 8), ("Ali", 8), ("Mia", 6)]
def by_score(record):
return record[1]
print(sorted(records, key=by_score, reverse=True))
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué muestra este código?
words = ["oak", "elm", "pine", "ash"]
print(max(words, key=len), min(words, key=len))
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
¿Qué muestra este código?
words = ["beta", "Alpha", "alpha", "Beta"]
print(sorted(words, key=str.lower))
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Qué muestra este código?
a = [9, 4, 7]
b = a
c = sorted(a)
a.reverse()
print(b, c)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
(name, score) por nombre de A a Z. Después los ordena de forma estable por puntuación, de mayor a menor. ¿Cómo quedan ordenados los registros con la misma puntuación en la lista final?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 6: Depura y combina operaciones con secuencias10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
values = [12, 24], ¿cuál es el valor de values[5:20]?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
None en caso contrario?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
¿Qué muestra este código?
items = [1, 2]
result = items.extend([3, 4])
print(len(items), result)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
¿Qué muestra este código?
records = [("A", 4), ("B", 9)]
amounts = []
for _, amount in records:
amounts.append(amount)
first, *rest = amounts[::-1]
print(first, rest)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué muestra este código?
values = [5, -2, 8, -4]
for i, value in enumerate(values):
if value < 0:
values[i] = -value
print(values[1::2])
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Qué muestra este código?
a = [[9, 2], [8, 1]]
b = a[:]
b.reverse()
b[0][0] = 6
print(a)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué muestra este código?
records = [("Rae", 7), ("Dev", 9), ("Cam", 7)]
def rank(record):
return (-record[1], record[0])
ordered = sorted(records, key=rank)
name, score = ordered[1]
print(name, score)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
¿Qué muestra este código?
def select(values):
kept = []
for value in values:
if value >= 5:
kept.append(value * 2)
return kept
a = [3, 5, 8]
b = select(a)
b.pop(0)
print(a, b)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
[31, 12, 27, 18, 24, 15, 21]. Después de ordenar una copia, ¿cuál es el valor central?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué muestra este código?
point = (6, 8)
old = point
point = (10,) + point[1:]
print(old, point)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Acumulador
total = 0 antes de procesar las lecturas y después usa total += reading para conservar las sumas anteriores.Alias
current = queue, añadir elementos mediante current también modifica la lista a la que se accede mediante queue.append()
append() añade su argumento como un elemento al final de la lista existente y devuelve None.[3, 4] con append a [1, 2] produce [1, 2, [3, 4]], porque el argumento sigue siendo un único elemento.Argumento predeterminado mutable
basket=[] conserva los elementos añadidos entre llamadas que usan ese valor porque cada llamada accede a la misma lista.Asignación a un elemento
prices[1] = 6.5 corrige un precio registrado; no puede crear un elemento en el índice len(prices).Asignación a un segmento
values[1:2] = [8, 9] sustituye una posición por dos valores y aumenta la longitud de la lista en uno.B
Bucle anidado
Búsqueda de la primera coincidencia
break para terminar la búsqueda inmediatamente.C
Celda
grid[0][2] = 9 sustituye la tercera celda de la primera fila, suponiendo que esa posición ya existe.Clave de ordenación en forma de tupla
(-score, name) ordena las puntuaciones de mayor a menor y usa los nombres de A a Z para deshacer los empates de puntuación.Clave de ordenación sin distinción entre mayúsculas y minúsculas
key=str.lower permite que "Oak" y "oak" sean iguales al compararse sin cambiar sus mayúsculas.Comprobación de pertenencia
in o not in."ready" in statuses permite determinar si una lista contiene esa cadena de estado exacta, distinguiendo entre mayúsculas y minúsculas.Concatenación
+ crea una lista externa nueva a partir de dos listas.morning + afternoon puede combinar dos listas de lecturas dejando intacta cada lista original.Contador
Copia profunda
copy.deepcopy(rows) permite conservar las celdas originales de una tabla mientras se edita una estructura anidada independiente.Copia superficial
b = a.copy(), añadir elementos a b modifica su lista externa, pero editar una fila compartida también puede afectar a a.count()
count() devuelve el número de elementos iguales a su argumento y devuelve 0 cuando el valor está ausente.[2, 2.0, 5].count(2) es 2 porque tanto el entero 2 como el número de coma flotante 2,0 son iguales a 2 al compararse.Criterio de desempate
D
Desempaquetado
name, score = ("Kai", 86) da a cada campo del registro un nombre de variable independiente y descriptivo.E
Elemento
["desk", ["pen", "pad"]], la lista externa tiene dos elementos, aunque la lista interna contenga dos cadenas.Empaquetado
result = lowest, highest almacena ambos valores en una tupla que puede devolverse desde una función.enumerate()
enumerate() proporciona pares que contienen un número consecutivo y un elemento, empezando por el número 0 de forma predeterminada.for i, value in enumerate(values): da al código tanto un índice como el elemento actual correspondiente.extend()
extend() añade cada elemento de un iterable al final de la lista existente y devuelve None.[1, 2] con [3, 4] produce cuatro elementos externos; ampliar con "ab" añade dos caracteres.F
Fila
grid[1] obtiene toda la segunda fila, por lo que len(grid[1]) cuenta las celdas de esa fila.Fila compartida
table = [row, row] almacena una fila dos veces, aunque mostrar la tabla presente dos posiciones de fila.Filtrado
Función de clave de ordenación
key=len ordena las palabras por longitud sin sustituirlas por los números de sus longitudes.Í
Índice
colors = ["blue", "gold"], el índice 1 selecciona 'gold', que también es el elemento del índice -1.I
Identidad
is; contenidos iguales pueden pertenecer a objetos de lista diferentes.[1, 3] separados son iguales al compararse, pero una comprobación de identidad entre esas listas es falsa.index()
index() encuentra el primer elemento igual en su rango de búsqueda y devuelve el índice de ese elemento en la lista completa.labels.index("go", 2) empieza a buscar en la posición 2, pero sigue contando su respuesta desde la posición 0.Inmutabilidad
insert()
insert() añade un elemento antes de una posición especificada, desplaza los elementos posteriores y aumenta la longitud de la lista.queue.insert(0, "urgent") coloca un elemento nuevo al principio sin sobrescribir el primer elemento anterior.Intercambio simultáneo
left, right = right, left conserva ambos valores sin necesitar un valor temporal con un nombre aparte.Inversión del orden
values.reverse() modifica una lista, mientras que values[::-1] crea una copia superficial en orden inverso.Iterable
list().list(range(3)) los reúne en la lista nueva [0, 1, 2].Iteración
for que recorre una lista del primer elemento al último.names asigna cada nombre actual a la variable del bucle antes de ejecutar su cuerpo.J
join()
join() combina las cadenas recibidas en una sola y coloca entre los elementos la cadena sobre la que se llama." / ".join(["red", "blue"]) crea 'red / blue'; los elementos numéricos deben convertirse primero en cadenas.L
Límite final excluido
values[2:5], el índice 5 marca dónde se detiene la selección y no aporta ningún elemento.Límite omitido
values[::-1], los límites omitidos permiten que el segmento hacia atrás incluya toda la lista en orden inverso.Lista
scores = [73, 91, 73] y procesarlos juntos.Lista anidada
[[2, 5], [7]], la lista externa contiene dos filas cuyas longitudes son dos y uno.Lista externa
b[0] = [9] sustituye una referencia a una fila, mientras que b[0].append(9) modifica el objeto de fila existente.M
Máximo hasta el momento
Media aritmética
[6, 10, 14], sum(readings) / len(readings) calcula la media como 10.0.Mediana
len(ordered) // 2.[5, 12, 2] da [2, 5, 12] y coloca la mediana 5 en el índice central 1.Método
queue.append("next") llama al método de la lista y proporciona como argumento el elemento que se debe añadir.Mutación
items[0] = 7 modifica la lista; cualquier alias de esa lista ve que su primera posición pasa a ser 7.N
Nombre precedido de asterisco
first, *rest = (4, 8, 12), rest es [8, 12], aunque la entrada sea una tupla.None como valor predeterminado
None como valor predeterminado puede señalar que se ha omitido un argumento de tipo lista, para que la función cree una lista nueva dentro de su cuerpo en cada llamada que lo omite.values=None, la rama if values is None: values = [] evita compartir por accidente una lista predeterminada.O
Operación sobre el objeto original
values.clear() vacía la lista existente, por lo que todos los alias ven cómo esa lista queda vacía.Orden descendente
reverse=True.[5, 1, 8] de forma descendente da [8, 5, 1]; invertir solo sus posiciones da [8, 1, 5].Orden lexicográfico
[3, 20] < [4, 1] es verdadero porque los primeros elementos deciden el orden antes de que se comparen los segundos.Ordenación estable
len.P
Parámetro de tipo lista
values.clear() vacía la lista del código que llama; asignar values = [] no lo hace.Paso del segmento
values[1::2] selecciona cada segunda posición empezando en 1; un paso negativo retrocede.pop()
pop() elimina y devuelve un elemento por índice, usando la última posición cuando no se proporciona un índice.current = queue.pop(0) guarda el primer elemento de la cola y elimina esa posición de la lista existente.R
Referencia
b = a da a ambos nombres de variable una ruta a la misma lista, por lo que las modificaciones pueden compartirse.Registro
("Kai", 86) puede representar un nombre y una puntuación; una lista de estos registros puede crecer a medida que llegan resultados.remove()
remove() elimina el primer elemento igual a su argumento y lanza ValueError cuando no hay coincidencias.labels.remove("old") elimina un valor coincidente; no interpreta "old" como una posición.Repetición
* con un entero para repetir en orden las referencias a elementos de una secuencia, y produce una secuencia vacía para cantidades de repeticiones no positivas.[0] * 5 crea cinco posiciones de contador, mientras que repetir una lista de fila puede crear filas internas compartidas.reversed()
reversed() proporciona los elementos de una secuencia del último al primero sin reorganizar sus posiciones almacenadas.for task in reversed(tasks): procesa primero la última tarea y conserva el orden original de la lista.Revinculación de un nombre
b = a, asignar b = [] da a b una lista nueva mientras a sigue haciendo referencia a la original.S
Segmento
tasks[1:4] crea una lista a partir de las posiciones 1, 2 y 3 sin incluir el elemento de la posición 4.sort()
sort() reorganiza la lista existente según el orden de comparación y devuelve None, con los argumentos opcionales key y reverse.scores.sort() cambia directamente el orden registrado, y los alias de scores ven las posiciones ordenadas.sorted()
sorted() acepta un iterable y devuelve una lista nueva de sus elementos según el orden de comparación, dejando el orden de entrada sin cambios.ordered = sorted(scores) mantiene disponible el orden de llegada original mediante la variable scores.split()
split() divide texto en una lista de fragmentos de cadena usando un separador especificado o reglas de espacios en blanco."yes|no|maybe".split("|") crea tres elementos de texto separados a partir de la entrada delimitada por separadores.T
Transformación
int(text) por cada cadena numérica construye una lista que puede sumarse con sum().Tupla
location = (5, 9) almacena un par de coordenadas fijo que sigue admitiendo acceso por índice y segmentos.Tupla de un elemento
(11,) es una tupla, mientras que (11) se evalúa como el entero 11 sin crear una colección.V
Valor apto para hash
(5, 9) puede ser una clave de coordenadas, pero ([5], 9) no puede serlo porque su lista interna no es apta para hash.Valor de retorno
None cuando su cuerpo no tiene una sentencia de retorno explícita.Variable del bucle
for value in values: value = 0, cambia el nombre del bucle, pero no las posiciones almacenadas en la lista.Z
zip()
zip() empareja elementos correspondientes de los iterables de entrada y, de forma predeterminada, se detiene cuando termina la entrada más corta.Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.