Listas y tuplas en Python

Las listas y las tuplas permiten que un programa de Python guarde muchos valores bajo un mismo nombre. Este material muestra cómo crear listas, leer elementos y segmentos por posición, modificar listas con métodos y procesarlas con bucles, incluidas las tablas almacenadas como listas de listas. Trata las tuplas y el desempaquetado, explica por qué dos variables pueden compartir una lista y cómo copiarla de forma segura, y termina con la ordenación mediante 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

  1. 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 índices
      Escribe 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 lista
      Extrae 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 incorporadas
      Une y repite listas con + y *, compara listas, calcula sumas, extremos y medias con sum(), min() y max(), y convierte entre cadenas y listas.
  2. 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 elementos
      Amplí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 elementos
      Localiza valores con index(), count() e in, y sustituye elementos individuales o rangos completos mediante asignaciones a un índice o a un segmento.
  3. 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 bucles
      Elige 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 listas
      Suma, 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 anidadas
      Almacena una tabla como una lista de filas, lee y modifica celdas con dos índices, y recorre todas las celdas con bucles anidados.
  4. 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 listas
      Escribe 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 valores
      Asigna 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.
  5. 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 alias
      Explica 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 internas
      Haz 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élvelas
      Predice 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.
  6. 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 registros
      Ordena 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.

Guía de estudio de Listas y tuplas en Python

6 capítulos

1

Crea 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ónResultadoPosición
scores[0]88Primera
scores[1]92Segunda
scores[2]75Tercera
scores[-1]75Última
scores[-2]92Penúltima
scores[-3]88Antepenú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 es len(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 lanza TypeError.
  • in comprueba 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
SegmentoSignificadoResultado
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ónResultado
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, min y max producen 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.
  • split crea fragmentos de texto; join, llamado sobre un separador, combina cadenas.
2

Modifica 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ónUsaDevuelve
items.pop()Última posiciónElemento eliminado
items.pop(i)Posición iElemento eliminado
items.remove(x)Primer valor igual a xNone
del items[i]Posición iSin valor de retorno
del items[start:stop]Segmento de posicionesSin valor de retorno
items.clear()Lista completaNone

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

  • append añade un elemento; extend añade cada elemento recibido.
  • insert añade antes de una posición y desplaza los elementos posteriores.
  • pop elimina por posición y devuelve el elemento.
  • remove elimina el primer valor igual y falla si está ausente.
  • del elimina posiciones o segmentos; clear vacía la misma lista.
  • Los métodos como append devuelven None, 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().

SentenciaEfecto 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

  • index devuelve la primera posición coincidente y lanza ValueError si falta el valor.
  • count devuelve 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.
3

Procesa 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 y enumerate para ambos.
  • Revincular la variable del bucle no sustituye un elemento de la lista.
  • zip se detiene en la entrada más corta.
  • reversed recorre hacia atrás sin modificar la lista.
  • Un bucle while debe avanzar su índice y detenerse antes de len(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 break para 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.
4

Usa 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ónValor 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, a para conservar ambos valores anteriores.
  • Los valores de retorno múltiples suelen empaquetarse en una tupla.
5

Sigue 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 existenteElemento añadido
b[0] = 9Lista existenteElemento sustituido
b = [7, 8]El nombre bLista 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 que is comprueba 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() y copy() 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.deepcopy copia 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 None y crea una lista dentro de la función para obtener un valor predeterminado nuevo.
6

Ordena 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

  • sort modifica una lista y devuelve None; sorted devuelve una lista nueva.
  • sorted acepta iterables como tuplas y cadenas.
  • reverse=True ordena 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=len o key=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.
  • min y max devuelven elementos originales y eligen el primero si hay empate de claves.

Ejemplos de Listas y tuplas en Python

6 Lecciones Interactivas

1

Lee los recuentos de entregas de una semana

13 pasos
Crea una lista, selecciona días y calcula una media de forma segura.
  1. 1
    Introducció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.

  2. 2
    EjemploAsocia 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 como deliveries[-1], usando un índice negativo desde el final.

  3. 3
    ConsejoComprueba 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 True y después False. El valor 9 aparece, pero 4 no, aunque 4 sea un índice válido. in comprueba los valores almacenados. Si quieres el recuento de la posición 4, usa deliveries[4], que devuelve 17.

  4. 4
    DesafíoEncuentra el penúltimo recuento

    ¿Qué devuelve deliveries[-2]? ¿Funcionaría deliveries[len(deliveries)]?

    ---reveal---

    El índice negativo -2 selecciona 9, una posición antes del elemento final 17. La segunda expresión intenta acceder al índice 5 y lanza IndexError. Usa len(deliveries) - 1 o -1 para seleccionar el último elemento; el número de elementos supera en uno al último índice no negativo.

  5. 5
    EjemploSelecciona 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. middle es una lista nueva, por lo que modificar sus posiciones externas no sustituirá una posición de deliveries.

  6. 6
    Explicació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.

  7. 7
    EjemploRecorre 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.

  8. 8
    DesafíoDistingue un recuento de una lista

    ¿Cuáles son los valores y tipos de deliveries[2] y deliveries[2:3]?

    ---reveal---

    deliveries[2] es el entero 15. 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.

  9. 9
    EjemploCalcula 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 31 y después 10.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.

  10. 10
    Idea 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. Aunque sum([]) es 0, dividir esa suma entre len([]) dividiría entre cero. min y max también fallan con estas entradas vacías.

  11. 11
    Conexió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. join se 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. split hace lo contrario: divide texto en fragmentos de cadena.

  12. 12
    Desafí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 en deliveries[2] sigue siendo 15.

  13. 13
    RepasoElige 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.

2

Edita una solicitud de suministros

10 pasos
Añade, elimina, busca y sustituye elementos siguiendo los resultados de los métodos.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónSigue la lista y el valor devuelto
  2. 2
    EjemploAñade un lote de artículos
  3. 3
    EjemploColoca un artículo al principio
  4. 4
    EjemploElimina y guarda un artículo recogido
  5. 5
    DesafíoElige una eliminación por valor
  6. 6
    EjemploEncuentra la posición que debes corregir
  7. 7
    EjemploSustituye un artículo por un lote
  8. 8
    DesafíoElimina un rango y encuentra un valor
  9. 9
    DesafíoFinaliza la solicitud sin perderla
  10. 10
    RepasoAsocia el cambio con la operación
3

Limpia lecturas y suma los valores de una tabla

13 pasos
Elige formas de bucle, construye un resultado y procesa filas de distintas longitudes.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDecide qué mantiene cada bucle
  2. 2
    ExplicaciónLee un valor sin editar su posición
  3. 3
    EjemploSustituye lecturas no válidas por índice
  4. 4
    ConexiónEmpareja etiquetas con lecturas
  5. 5
    DesafíoExplica un elemento omitido
  6. 6
    EjemploCuenta las lecturas positivas
  7. 7
    EjemploConstruye un resultado filtrado y transformado
  8. 8
    ConsejoBusca hasta la primera coincidencia
  9. 9
    DesafíoElige un máximo válido
  10. 10
    EjemploSelecciona una fila y una celda
  11. 11
    EjemploSuma todas las filas
  12. 12
    DesafíoFiltra en toda la tabla
  13. 13
    RepasoSepara la inicialización del trabajo repetido
4

Usa un registro fijo y desempaqueta sus campos

10 pasos
Sigue posiciones de tuplas, desempaquetado con asterisco, intercambios y pares devueltos.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónMantén un registro unido
  2. 2
    EjemploCrea el registro de la estación
  3. 3
    Idea claveComprueba el límite de la inmutabilidad
  4. 4
    DesafíoCrea una tupla de un elemento
  5. 5
    EjemploDa un nombre a cada campo
  6. 6
    EjemploConserva la primera lectura y el resto
  7. 7
    DesafíoIntercambia valores de coordenadas
  8. 8
    EjemploDevuelve un par de extremos
  9. 9
    DesafíoLee y desempaqueta un campo seleccionado
  10. 10
    RepasoLee la estructura antes de desempaquetar
5

Sigue una tabla copiada a través de una función

14 pasos
Distingue alias, copias superficiales, copias profundas y cambios locales de parámetros.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDibuja rutas hacia los objetos
  2. 2
    EjemploCrea un alias
  3. 3
    EjemploRedirige un nombre
  4. 4
    DesafíoPredice dos tipos de suma
  5. 5
    EjemploCopia la tabla externa
  6. 6
    EjemploModifica una fila compartida
  7. 7
    Idea claveSustituye una fila copiada
  8. 8
    DesafíoElige una copia más profunda
  9. 9
    EjemploModifica mediante un parámetro
  10. 10
    ConexiónDevuelve una lista independiente
  11. 11
    ExplicaciónEvita una cesta predeterminada persistente
  12. 12
    DesafíoDistingue la revinculación local del vaciado
  13. 13
    DesafíoSigue una copia superficial pasada a una función
  14. 14
    RepasoSigue el nivel que se modifica
6

Clasifica registros sin perder su orden de llegada

13 pasos
Ordena una copia, selecciona claves, deshaz empates y conserva el orden entre claves iguales.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDistingue los datos almacenados de las claves de comparación
  2. 2
    EjemploConserva el orden de llegada
  3. 3
    EjemploCompara la inversión con la ordenación descendente
  4. 4
    ConsejoComprueba el tipo de entrada
  5. 5
    DesafíoSigue el resultado de una ordenación
  6. 6
    EjemploElige una clave de puntuación
  7. 7
    Idea claveConserva el orden de llegada en los empates
  8. 8
    DesafíoPasa un objeto que pueda llamarse
  9. 9
    EjemploAñade un criterio de desempate alfabético
  10. 10
    ConsejoInvierte solo la dirección numérica
  11. 11
    ConexiónElige un elemento por una clave extrema
  12. 12
    DesafíoConserva la forma de los registros y los nombres
  13. 13
    RepasoElige el efecto y la regla

Ejercicios de Listas y tuplas en Python

60 Preguntas de Práctica en 6 sets

Set 1: Lee, segmenta y modifica secuencias10 Preguntas de Práctica

Pregunta 1 de 10

Para levels = [14, 29, 37, 52], ¿cuál es el valor de levels[-2]?
  1. 29
  2. 52
  3. 37
  4. 14
Mostrar respuestaOcultar respuesta
Respuesta: C
Un índice negativo cuenta desde el final: -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

Para codes = [2, 5, 8, 11, 14, 17], ¿cuál es el valor de codes[1:5:2]?
  1. [5, 11]
  2. [5, 8, 11, 14]
  3. [5, 11, 17]
  4. [2, 8, 14]
Mostrar respuestaOcultar respuesta
Respuesta: A
El segmento empieza en el índice 1 y después visita el índice 3 porque su paso es 2. Se detiene antes del índice 5, por lo que el resultado es [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"])
  1. ['pen', 'clip', 'pad']
  2. [['pen'], ['clip', 'pad']]
  3. ['pen', 'clip pad']
  4. ['pen', ['clip', 'pad']]
Mostrar respuestaOcultar respuesta
Respuesta: D
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])
  1. 8 12
  2. 3 12
  3. 3 6
  4. 8 |
Mostrar respuestaOcultar respuesta
Respuesta: B
Dividir por los dos separadores crea tres elementos de tipo cadena: '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]
  1. 4
  2. 5
  3. 6
  4. 3
Mostrar respuestaOcultar respuesta
Respuesta: B
El segmento selecciona dos elementos existentes, en los índices 1 y 2, y los sustituye por tres elementos. La longitud nueva es 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

¿Cómo escribes una tupla que contenga solo el entero 12?
  1. (12)
  2. [12]
  3. tuple(12)
  4. (12,)
Mostrar respuestaOcultar respuesta
Respuesta: D
Una tupla de un elemento necesita una coma final, por lo que (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)
  1. 18 [0, 24]
  2. 0 [18, 24]
  3. None [0, 24]
  4. 24 [18, 0]
Mostrar respuestaOcultar respuesta
Respuesta: A
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])
  1. 6
  2. 12
  3. 9
  4. 15
Mostrar respuestaOcultar respuesta
Respuesta: C
El primer segmento selecciona los índices del 1 al 3, dando [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

Para items = [9, 16, 25], ¿qué ocurre cuando Python evalúa items[len(items)]?
  1. Lanza IndexError.
  2. Devuelve el último elemento, 25.
  3. Devuelve el primer elemento, 9.
  4. Lanza TypeError.
Mostrar respuestaOcultar respuesta
Respuesta: A
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

¿Qué produce esta comparación: [4, 99] < [5, 1]?
  1. False, porque el segundo par es 99 y 1.
  2. False, porque la primera lista tiene la suma mayor.
  3. True, porque ambas listas tienen la misma longitud.
  4. True, porque el primer par desigual es 4 y 5.
Mostrar respuestaOcultar respuesta
Respuesta: D
El orden de secuencias compara posiciones correspondientes de izquierda a derecha. El primer par ya difiere, y 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)
  1. [0, 0]
  2. [8, 3]
  3. [0, 3]
  4. [8, 0]
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)
  1. 1
  2. 33
  3. 2
  4. 3
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Para table = [[6, 8, 10], [11, 13, 15]], ¿qué produce table[1][0] + table[0][2]?
  1. 21
  2. 19
  3. 25
  4. 23
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

¿Cuántos pares contiene list(zip(["Lee", "Mo", "Nia"], [41, 56]))?
  1. 3
  2. 5
  3. 2
  4. 1
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])
  1. 2 -8
  2. -1 2
  3. -4 1
  4. 1 -4
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
  1. 3
  2. 6
  3. 9
  4. 2
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)
  1. [1]
  2. [0, 0, 1]
  3. [1, 0]
  4. [0, 1]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un bucle debe encontrar el mayor valor de la lista no vacía [-14, -6, -19]. ¿Con qué debe inicializarse su máximo hasta el momento?
  1. El primer elemento, -14.
  2. El número cero, 0.
  3. La longitud de la lista, 3.
  4. El primer índice, 0.
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)
  1. [4, 8]
  2. [5, 9]
  3. [5, 16, 9, 22]
  4. [16, 22]
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
  1. [[6, 0], [6, 0]]
  2. [[0, 6], [0, 0]]
  3. [[0, 0], [6, 0]]
  4. [[0, 0], [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

Después de label, amount = ("rice", 4), ¿qué valor contiene amount?
  1. 'rice'
  2. (4,)
  3. ('rice', 4)
  4. 4
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

¿Cuál es el valor de middle después de first, *middle, last = (2, 5, 8, 11, 14)?
  1. (5, 8, 11)
  2. [5, 8, 11]
  3. [2, 5, 8, 11]
  4. [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)
  1. True True
  2. False True
  3. True False
  4. False False
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)
  1. ([2, 7], 'ready')
  2. ([2], 'ready')
  3. ([7], 'ready')
  4. ([2], 'ready', 7)
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)
  1. [4, 9, 12] [4]
  2. [4, 9, 12] [4, 9, 12]
  3. [4, 9, 12] [4, 9]
  4. [4, 9] [4, 9, 12]
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)
  1. 18 5
  2. 5 18
  3. 18 18
  4. 5 5
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)
  1. [10, 6] [10, 6]
  2. [2, 6] [2, 6]
  3. [10, 6] [2, 6]
  4. [2, 6] [10, 6]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un programa necesita una clave de diccionario que represente la fila 3 y la columna 7. ¿Qué valor puede usar como clave de coordenadas?
  1. [3, 7]
  2. (3, 7)
  3. ([3], 7)
  4. (3, [7])
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)
  1. [[4], [8]]
  2. [[4, 6], [9]]
  3. [[4], [9]]
  4. [[4, 6], [8]]
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)
  1. [[1, 7], [1, 7]] [8, 9]
  2. [[8, 7], [8, 7]] [8, 7]
  3. [[1, 7], [1, 2]] [8, 9]
  4. [[1, 2], [1, 2]] [8, 7]
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

Para tags = ["new", "old", "new"], ¿qué devuelve tags.count("done")?
  1. 0
  2. -1
  3. None
  4. ValueError
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)
  1. []
  2. None
  3. [11, 22]
  4. [0, 0]
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])
  1. [[3, 5], [7]] True
  2. [[3], [7]] False
  3. [[3], [7]] True
  4. [[3, 5], [7]] False
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)
  1. False ['x']
  2. True ['x']
  3. False ['x', 'y']
  4. True ['x', 'y']
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)
  1. [9, 12] None
  2. [6, 9, 12] [9, 12]
  3. [9, 12] [9, 12]
  4. None [9, 12]
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)
  1. [0] [0]
  2. [3, 8] [0]
  3. [3] [0]
  4. [3, 8] [3, 8]
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]
  1. [[9, 9], [0, 0], [0, 4]]
  2. [[9, 9], [9, 9], [9, 9]]
  3. [[0, 4], [0, 4], [0, 4]]
  4. [[9, 9], [0, 4], [0, 4]]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Para codes = ["q", "r", "q", "s", "q"], ¿cuál es el valor de codes.index("q", 1)?
  1. 0
  2. 1
  3. 2
  4. 4
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)
  1. [4, 7, 9] [4, 7, 9] True
  2. [4] [7] False
  3. [4, 9] [7] True
  4. [4, 9] [7, 9] False
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)
  1. [[1], [2]]
  2. [[1, 5], [2]]
  3. [[1, 5], [2], [9]]
  4. [[1], [2], [9]]
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

¿Qué valor contiene result después de nums = [8, 2, 5] y result = nums.sort()?
  1. [2, 5, 8]
  2. [8, 5, 2]
  3. None
  4. [8, 2, 5]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

¿Qué devuelve sorted(["20", "3", "11"])?
  1. ['3', '11', '20']
  2. ['20', '3', '11']
  3. ['3', '20', '11']
  4. ['11', '20', '3']
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

¿Qué devuelve sorted(["pear", "a", "plum", "to"], key=len)?
  1. ['a', 'to', 'plum', 'pear']
  2. ['a', 'to', 'pear', 'plum']
  3. ['a', 'pear', 'plum', 'to']
  4. ['pear', 'plum', 'to', 'a']
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Para values = [6, 1, 4], ¿qué par de resultados producen values[::-1] y sorted(values, reverse=True), en ese orden?
  1. [4, 1, 6] y [6, 4, 1]
  2. [6, 4, 1] y [4, 1, 6]
  3. [4, 1, 6] y [4, 1, 6]
  4. [6, 4, 1] y [6, 4, 1]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Los registros son pares (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?
  1. return (record[1], record[0])
  2. return (record[0], -record[1])
  3. return (-record[1], len(record[0]))
  4. return (-record[1], record[0])
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))
  1. [('Ali', 8), ('Zoe', 8), ('Mia', 6)]
  2. [('Mia', 6), ('Zoe', 8), ('Ali', 8)]
  3. [('Zoe', 8), ('Ali', 8), ('Mia', 6)]
  4. [('Zoe', 8), ('Mia', 6), ('Ali', 8)]
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))
  1. pine oak
  2. pine ash
  3. 4 3
  4. pine elm
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))
  1. ['beta', 'Beta', 'Alpha', 'alpha']
  2. ['Alpha', 'alpha', 'beta', 'Beta']
  3. ['Alpha', 'beta', 'alpha', 'Beta']
  4. ['Alpha', 'Beta', 'beta', 'alpha']
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)
  1. [7, 4, 9] [4, 7, 9]
  2. [4, 7, 9] [4, 7, 9]
  3. [9, 4, 7] [4, 7, 9]
  4. [7, 4, 9] [9, 7, 4]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un programa ordena primero registros (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?
  1. Por nombre de Z a A dentro de cada grupo con igual puntuación.
  2. Por nombre de A a Z antes de cualquier comparación de puntuaciones.
  3. Por su orden anterior a cualquiera de las dos ordenaciones.
  4. Por nombre de A a Z dentro de cada grupo con igual puntuación.
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

Para values = [12, 24], ¿cuál es el valor de values[5:20]?
  1. IndexError
  2. []
  3. [24]
  4. [12, 24]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una lista numérica puede estar vacía. ¿Cómo puede una función devolver su media cuando hay valores y None en caso contrario?
  1. Comprobar if not values: return None y después devolver sum(values) / len(values).
  2. Comprobar if not values: return 0 y después devolver sum(values) / len(values).
  3. Devolver sum(values) / len(values) antes de comprobar si la lista está vacía.
  4. Comprobar if values: return None y después devolver sum(values) / len(values).
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)
  1. 3 None
  2. 4 [1, 2, 3, 4]
  3. 2 [3, 4]
  4. 4 None
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)
  1. 4 [9]
  2. 9 (4,)
  3. 9 [4]
  4. [9] 4
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])
  1. [2, 4]
  2. [-2, -4]
  3. [5, 8]
  4. [5, 2, 8, 4]
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)
  1. [[6, 1], [9, 2]]
  2. [[9, 2], [8, 1]]
  3. [[9, 2], [6, 1]]
  4. [[6, 2], [8, 1]]
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)
  1. Rae 7
  2. Cam 7
  3. Dev 9
  4. Cam -7
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)
  1. [3, 5, 8] [10, 16]
  2. [5, 8] [16]
  3. [3, 5, 8] [10]
  4. [3, 5, 8] [16]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una lista no vacía de longitud impar es [31, 12, 27, 18, 24, 15, 21]. Después de ordenar una copia, ¿cuál es el valor central?
  1. 18
  2. 21
  3. 24
  4. 27
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)
  1. (6, 8) (10, 8)
  2. (10, 8) (10, 8)
  3. (6, 8) (6, 10)
  4. (6, 8) (10,)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

73 Términos Clave, cada uno con su definición

A

Acumulador
Un acumulador es una variable que conserva un resultado acumulado entre iteraciones del bucle, como una suma actualizada al añadir cada elemento.
Establece total = 0 antes de procesar las lecturas y después usa total += reading para conservar las sumas anteriores.
Alias
Un alias es otro nombre o referencia para el mismo objeto, lo que permite que una mutación realizada mediante una ruta aparezca mediante otra.
Si current = queue, añadir elementos mediante current también modifica la lista a la que se accede mediante queue.
append()
El método de lista append() añade su argumento como un elemento al final de la lista existente y devuelve None.
Añadir [3, 4] con append a [1, 2] produce [1, 2, [3, 4]], porque el argumento sigue siendo un único elemento.
Argumento predeterminado mutable
Un argumento predeterminado mutable es un objeto modificable creado al definir una función y reutilizado por las llamadas que omiten ese argumento.
Un valor predeterminado 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
La asignación a un elemento sustituye el objeto de una posición existente de una secuencia mutable y deja sin cambios la longitud de la secuencia externa.
prices[1] = 6.5 corrige un precio registrado; no puede crear un elemento en el índice len(prices).
Asignación a un segmento
La asignación a un segmento sustituye un rango seleccionado de una secuencia mutable; un rango contiguo puede recibir una cantidad distinta de elementos.
values[1:2] = [8, 9] sustituye una posición por dos valores y aumenta la longitud de la lista en uno.

B

Bucle anidado
Un bucle anidado es un bucle dentro de otro; el bucle interno completa su trabajo por cada iteración del externo.
Un bucle de filas que contiene un bucle de celdas puede procesar tablas con distintas cantidades de elementos en cada fila.
Búsqueda de la primera coincidencia
Una búsqueda de la primera coincidencia recorre elementos hasta que uno cumple una comprobación, guarda su resultado y se detiene antes de que las coincidencias posteriores puedan sustituirlo.
Un bucle puede guardar el índice de la primera lectura negativa y usar break para terminar la búsqueda inmediatamente.

C

Celda
Una celda es un valor de una tabla al que se accede seleccionando su fila y después su posición dentro de esa fila.
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
Una clave de ordenación en forma de tupla combina campos de comparación por orden de prioridad; los campos posteriores deciden solo cuando todos los anteriores empatan.
Devolver (-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
Una clave de ordenación sin distinción entre mayúsculas y minúsculas compara valores de texto normalizados y conserva la escritura de cada cadena original en la colección devuelta.
key=str.lower permite que "Oak" y "oak" sean iguales al compararse sin cambiar sus mayúsculas.
Comprobación de pertenencia
Una comprobación de pertenencia comprueba si aparece un valor igual en una colección y devuelve un resultado booleano mediante 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
La concatenación une secuencias una detrás de otra; la concatenación de listas con + crea una lista externa nueva a partir de dos listas.
morning + afternoon puede combinar dos listas de lecturas dejando intacta cada lista original.
Contador
Un contador es una variable que registra cuántas veces se cumple una condición, normalmente empezando en 0 y aumentando en 1 por coincidencia.
Un contador de puntuaciones suma 1 por cada puntuación de aprobado, tanto si esa puntuación es 60 como si es 100.
Copia profunda
Una copia profunda duplica de forma recursiva una estructura anidada para que los cambios en las listas internas copiadas no afecten a las listas internas originales.
copy.deepcopy(rows) permite conservar las celdas originales de una tabla mientras se edita una estructura anidada independiente.
Copia superficial
Una copia superficial crea un contenedor externo nuevo y conserva las referencias a los elementos originales, incluidas las listas internas mutables.
Después de b = a.copy(), añadir elementos a b modifica su lista externa, pero editar una fila compartida también puede afectar a a.
count()
El método de lista 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
Un criterio de desempate es una regla secundaria de comparación usada cuando una regla anterior da claves iguales, como comparar nombres después de puntuaciones iguales.
Dos registros con puntuación 80 pueden ordenarse por nombre cuando la clave incluye ese nombre después de la puntuación.

D

Desempaquetado
El desempaquetado asigna elementos de un iterable a varios destinos en orden y requiere cantidades coincidentes, salvo que un asterisco recoja los valores sobrantes.
name, score = ("Kai", 86) da a cada campo del registro un nombre de variable independiente y descriptivo.

E

Elemento
Un elemento es un valor que ocupa una posición en una colección; una lista anidada cuenta como un elemento de su lista externa.
En ["desk", ["pen", "pad"]], la lista externa tiene dos elementos, aunque la lista interna contenga dos cadenas.
Empaquetado
El empaquetado reúne varios valores de expresiones en una tupla, normalmente mediante comas sin necesidad de paréntesis alrededor.
result = lowest, highest almacena ambos valores en una tupla que puede devolverse desde una función.
enumerate()
La función incorporada 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()
El método de lista extend() añade cada elemento de un iterable al final de la lista existente y devuelve None.
Ampliar [1, 2] con [3, 4] produce cuatro elementos externos; ampliar con "ab" añade dos caracteres.

F

Fila
Una fila de una tabla basada en listas es una lista interna, seleccionada por el primer índice antes de que un segundo índice seleccione una celda dentro de ella.
grid[1] obtiene toda la segunda fila, por lo que len(grid[1]) cuenta las celdas de esa fila.
Fila compartida
Una fila compartida es una lista interna a la que hacen referencia varias posiciones de una tabla, por lo que editar una celda puede reflejarse en más de una fila mostrada.
table = [row, row] almacena una fila dos veces, aunque mostrar la tabla presente dos posiciones de fila.
Filtrado
El filtrado construye una colección con los elementos que cumplen una condición y excluye los que no la cumplen.
Un bucle puede añadir a una lista nueva solo las puntuaciones de al menos 60, conservando el orden original de las puntuaciones.
Función de clave de ordenación
Una función de clave de ordenación calcula un valor de comparación a partir de cada elemento de entrada y deja intactos los elementos originales en la salida ordenada.
Usar key=len ordena las palabras por longitud sin sustituirlas por los números de sus longitudes.

Í

Índice
Un índice es una posición entera usada para seleccionar un elemento; Python cuenta desde 0 al principio o desde -1 al final.
Para colors = ["blue", "gold"], el índice 1 selecciona 'gold', que también es el elemento del índice -1.

I

Identidad
La identidad es la propiedad de ser el mismo objeto, comprobada mediante is; contenidos iguales pueden pertenecer a objetos de lista diferentes.
Dos literales [1, 3] separados son iguales al compararse, pero una comprobación de identidad entre esas listas es falsa.
index()
El método de lista 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
La inmutabilidad significa que el estado propio de un objeto no puede modificarse sobre el objeto original; una tupla fija sus referencias a elementos, no los objetos mutables de su interior.
Una tupla que contiene una lista no permite sustituir la posición de esa lista, pero la lista almacenada sí puede recibir un append.
insert()
El método de lista 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
Un intercambio simultáneo evalúa ambos valores anteriores antes de asignarlos a los nombres opuestos en una sentencia de desempaquetado.
left, right = right, left conserva ambos valores sin necesitar un valor temporal con un nombre aparte.
Inversión del orden
La inversión del orden da la vuelta al orden existente de una secuencia sin elegir posiciones por valor, por lo que no tiene por qué producir un orden ascendente o descendente.
values.reverse() modifica una lista, mientras que values[::-1] crea una copia superficial en orden inverso.
Iterable
Un iterable es un objeto que puede proporcionar elementos de uno en uno a un bucle o a una función como list().
Un rango proporciona números, por lo que list(range(3)) los reúne en la lista nueva [0, 1, 2].
Iteración
La iteración es el procesamiento repetido de elementos proporcionados por turnos, como un bucle for que recorre una lista del primer elemento al último.
Un bucle sobre names asigna cada nombre actual a la variable del bucle antes de ejecutar su cuerpo.

J

join()
El método de cadena 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
Un límite final excluido es el extremo no incluido de un segmento; las posiciones seleccionadas terminan antes de ese límite en la dirección del paso.
En values[2:5], el índice 5 marca dónde se detiene la selección y no aporta ningún elemento.
Límite omitido
Un límite omitido permite que un segmento use el extremo adecuado de una secuencia, según si su paso avanza o retrocede.
En values[::-1], los límites omitidos permiten que el segmento hacia atrás incluya toda la lista en orden inverso.
Lista
Una lista es una colección ordenada y mutable cuyos elementos pueden leerse por posición y que puede contener valores repetidos o de distintos tipos.
Un programa puede almacenar varios resultados de cuestionarios en scores = [73, 91, 73] y procesarlos juntos.
Lista anidada
Una lista anidada es una lista que contiene otras listas; cada lista interna es un elemento al que se puede acceder y que puede procesarse por separado.
En [[2, 5], [7]], la lista externa contiene dos filas cuyas longitudes son dos y uno.
Lista externa
Una lista externa es el contenedor que contiene objetos internos; modificar una de sus posiciones es distinto de modificar el objeto de esa posición.
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
Un máximo hasta el momento es el mayor elemento visto hasta ahora, inicializado con un elemento real y sustituido siempre que llega uno mayor.
Empezar con la primera lectura permite que el patrón encuentre correctamente el mayor valor cuando todas las lecturas son negativas.
Media aritmética
La media aritmética de una colección numérica no vacía es su suma dividida entre el número de elementos; aquí una colección vacía no tiene media.
Para las lecturas [6, 10, 14], sum(readings) / len(readings) calcula la media como 10.0.
Mediana
La mediana es el valor central de los datos ordenados; para una lista no vacía de longitud impar, es el elemento del índice len(ordered) // 2.
Ordenar [5, 12, 2] da [2, 5, 12] y coloca la mediana 5 en el índice central 1.
Método
Un método es una función asociada a un objeto que se llama mediante notación de punto para realizar una operación sobre ese objeto.
queue.append("next") llama al método de la lista y proporciona como argumento el elemento que se debe añadir.
Mutación
La mutación modifica el contenido o estado de un objeto existente, por lo que todas las referencias a ese objeto pueden observar el mismo cambio.
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
Un nombre precedido de asterisco en un desempaquetado recoge todos los valores no asignados a los destinos sin asterisco y siempre recibe una lista.
En first, *rest = (4, 8, 12), rest es [8, 12], aunque la entrada sea una tupla.
None como valor predeterminado
Usar 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.
Con values=None, la rama if values is None: values = [] evita compartir por accidente una lista predeterminada.

O

Operación sobre el objeto original
Una operación sobre el objeto original modifica un objeto existente, de modo que otras referencias a ese objeto observan el mismo estado modificado.
values.clear() vacía la lista existente, por lo que todos los alias ven cómo esa lista queda vacía.
Orden descendente
El orden descendente coloca los valores de comparación mayores antes que los menores y se solicita con la opción de ordenación con nombre reverse=True.
Ordenar [5, 1, 8] de forma descendente da [8, 5, 1]; invertir solo sus posiciones da [8, 1, 5].
Orden lexicográfico
El orden lexicográfico compara secuencias de izquierda a derecha: decide el primer par desigual o va primero el prefijo coincidente más corto.
[3, 20] < [4, 1] es verdadero porque los primeros elementos deciden el orden antes de que se comparen los segundos.
Ordenación estable
La ordenación estable conserva el orden relativo de entrada de los elementos cuyas claves de comparación son iguales, también al ordenar de forma descendente.
Las palabras de igual longitud mantienen su orden relativo original cuando la única función de clave de ordenación es len.

P

Parámetro de tipo lista
Un parámetro de tipo lista es un nombre local de una función que hace referencia inicialmente al objeto de lista del código que llama y permite que la función lo modifique.
Una función que llama a values.clear() vacía la lista del código que llama; asignar values = [] no lo hace.
Paso del segmento
El paso de un segmento es un entero distinto de cero que controla la separación y la dirección entre las posiciones seleccionadas de una secuencia.
values[1::2] selecciona cada segunda posición empezando en 1; un paso negativo retrocede.
pop()
El método de lista 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
Una referencia conecta un nombre o una posición de contenedor con un objeto; copiar esa referencia no copia el objeto en sí.
b = a da a ambos nombres de variable una ruta a la misma lista, por lo que las modificaciones pueden compartirse.
Registro
Un registro es un grupo de campos relacionados que describen una entidad, a menudo almacenado como una tupla cuyas posiciones tienen significados distintos.
("Kai", 86) puede representar un nombre y una puntuación; una lista de estos registros puede crecer a medida que llegan resultados.
remove()
El método de lista 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
La repetición usa * 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()
La función incorporada 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
La revinculación cambia el objeto al que hace referencia un nombre sin redirigir otros nombres que se referían al objeto anterior.
Después de b = a, asignar b = [] da a b una lista nueva mientras a sigue haciendo referencia a la original.

S

Segmento
Un segmento selecciona una secuencia de elementos mediante límites y un paso opcional, y devuelve una secuencia nueva del tipo original.
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()
El método de lista 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()
La función incorporada 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()
El método de cadena 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
Una transformación calcula un valor de salida a partir de un elemento de entrada, a menudo construyendo una lista nueva con un resultado por elemento original.
Añadir int(text) por cada cadena numérica construye una lista que puede sumarse con sum().
Tupla
Una tupla es una secuencia ordenada cuyas posiciones de elementos no pueden sustituirse, añadirse ni eliminarse después de crearla.
location = (5, 9) almacena un par de coordenadas fijo que sigue admitiendo acceso por índice y segmentos.
Tupla de un elemento
Una tupla de un elemento es una tupla con una única posición, escrita con una coma final para distinguirla de una expresión agrupada.
(11,) es una tupla, mientras que (11) se evalúa como el entero 11 sin crear una colección.

V

Valor apto para hash
Un valor apto para hash admite las reglas estables de consulta necesarias para las claves de diccionario; las tuplas requieren contenido apto para hash y las listas no son aptas 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
Un valor de retorno es el objeto que una llamada a función produce para el código que la llama, independiente de los cambios realizados en los argumentos durante la llamada.
Una función puede añadir un elemento a una lista y aun así devolver None cuando su cuerpo no tiene una sentencia de retorno explícita.
Variable del bucle
Una variable del bucle es un nombre vinculado al elemento actual en cada iteración; revincularlo no asigna dentro de la lista original.
En for value in values: value = 0, cambia el nombre del bucle, pero no las posiciones almacenadas en la lista.

Z

zip()
La función incorporada zip() empareja elementos correspondientes de los iterables de entrada y, de forma predeterminada, se detiene cuando termina la entrada más corta.
Emparejar tres nombres con dos puntuaciones crea dos pares; el nombre sin pareja necesita una decisión aparte.

Sobre esta unidad

Por StudeliInformar de un error

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.

Comenzar