Lesson 7
Liza
1. Liza
La mayoría de los programas funcionan no solo con variables. También usan listas de variables. Por ejemplo, un programa puede manejar información sobre estudiantes de una clase leyendo la lista de estudiantes desde el teclado o desde un archivo. Un cambio en el número de estudiantes en la clase no debe requerir la modificación del código fuente del programa.
Anteriormente ya nos enfrentamos a la tarea de procesar elementos de una secuencia, por ejemplo, al calcular el elemento más grande de la secuencia. Pero no hemos mantenido toda la secuencia en la memoria de la computadora. Sin embargo, en muchos problemas es necesario mantener toda la secuencia, como si tuviéramos que imprimir todos los elementos de una secuencia en orden ascendente ("ordenar una secuencia").
Para almacenar tales datos, en Python puede usar la estructura de datos llamada lista (en la mayoría de los lenguajes de programación se usa el término diferente - "matriz"). Una lista es una secuencia de elementos numerados de 0, igual que los caracteres de la cadena. La lista se puede configurar manualmente enumerando los elementos de la lista entre corchetes, como aquí: < Primes = [2, 3, 5, 7, 11, 13] Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
La lista Primes
tiene 6 elementos, a saber: Primes[0] == 2
, Primes[1] == 3
, Primes[2] == 5
, Primes[3] == 7
, Primes[4] == 11
, Primes[5] == 13
. La lista Rainbow
tiene 7 elementos, cada uno de los cuales es la cadena.
Al igual que los caracteres de la cadena, los elementos de la lista también pueden tener un índice negativo, por ejemplo, Primes[-1] == 13
, Primes[-6] == 2
. El índice negativo significa que comenzamos en el último elemento y vamos a la izquierda al leer una lista.
Puede obtener el número de elementos en una lista con la función len
(que significa longitud de la lista ), por ejemplo len(Primes) == 6
.
A diferencia de las cadenas, los elementos de una lista son modificables; se pueden cambiar asignándoles nuevos valores.
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet'] print(Rainbow[0]) Rainbow[0] = 'red' print('Print the rainbow') for i in range(len(Rainbow)): print(Rainbow[i])
Considere varias formas de crear y leer listas. En primer lugar, puede crear una lista vacía (la lista sin elementos, su longitud es 0), y puede agregar elementos al final de su lista utilizando append
. Por ejemplo, supongamos que el programa recibe el número de elementos en la lista n
, y luego n
elementos de la lista, uno por uno, cada uno en la línea separada. Aquí hay un ejemplo de datos de entrada en este formato:
5 1809 1854 1860 1891 1925En este caso, puede organizar la lectura de dicha lista de la siguiente manera:
a = [] # comenzar una lista vacía n = int(input()) # leer el número de elemento en la lista for i in range(n): new_element = int(input()) # leer el siguiente elemento a.append(new_element) # Añadirlo a la lista # las dos últimas líneas podrían ser reemplazadas por una: # a.append (int (input ())) print(a)
En el ejemplo demostrado, se crea la lista vacía, luego se lee el número de elementos, luego se leen los elementos de la lista línea por línea y se agregan al final. Lo mismo se puede hacer, guardando la variable n
:
a = [] for i in range(int(input())): a.append(int(input())) print(a)
Hay varias operaciones definidas para listas: concatenación de lista (adición de listas, es decir, "pegado" de una lista a otra) y repetición (multiplicación de una lista por un número). Por ejemplo:
a = [1, 2, 3] b = [4, 5] c = a + b d = b * 3 print([7, 8] + [9]) print([0, 1] * 3)
La lista resultante c
será igual a [1, 2, 3, 4, 5]
, y una lista de d
será igual a [4, 5, 4, 5, 4, 5]
. Esto le permite organizar el proceso de lectura de listas de manera diferente: primero, considere el tamaño de la lista y cree una lista a partir del número deseado de elementos, luego recorra la variable i
comenzando con el número 0 y dentro del ciclo lea el elemento i
-ésimo de la lista:
a = [0] * int(input()) for i in range(len(a)): a[i] = int(input())
Puede imprimir elementos de una lista a
con print(a)
; esto muestra los elementos de la lista rodeados de corchetes y separados por comas. En general, esto es inconveniente; en común, está a punto de imprimir todos los elementos en una línea o un artículo por línea. Aquí hay dos ejemplos de eso, usando otras formas de bucle:
a = [1, 2, 3, 4, 5] for i in range(len(a)): print(a[i])
Aquí se cambia el índice i
, luego se muestra el elemento a[i]
.
a = [1, 2, 3, 4, 5] for elem in a: print(elem, end=' ')
En este ejemplo, los elementos de la lista se muestran en una línea separados por espacios, y no es el índice el que cambia, sino el valor de la variable en sí (por ejemplo, en el ciclo for elem in ['red', 'green', 'blue']
variable de elem
tomará los valores 'red'
, 'green'
, 'blue'
, sucesivamente.
Presta especial atención al último ejemplo! Una parte muy importante de la ideología de Python es for
bucle, que proporciona la forma conveniente de iterar sobre todos los elementos de alguna secuencia. Aquí es donde Python difiere de Pascal, donde tiene que iterar sobre los índices de los elementos, pero no sobre los elementos mismos.
Las secuencias en Python son cadenas, listas, valores del range()
funciones range()
(estas no son listas) y algunos otros objetos.
Aquí hay un ejemplo que muestra el uso del bucle for
cuando se necesita extraer todos los dígitos de una cadena y hacer una lista numérica de ellos.
# dado: s = 'ab12c59p7dq' # necesitas extraer los dígitos de la lista s # para hacerlo así: # dígitos == [1, 2, 5, 9, 7] s = 'ab12c59p7dq' digits = [] for symbol in s: if '1234567890'.find(symbol) != -1: digits.append(int(symbol)) print(digits)
2. Dividir y unir métodos
Los elementos de la lista se pueden dar en una línea separada por un personaje; en este caso, toda la lista puede leerse usando input()
. A continuación, puede utilizar un método de cadena split()
, que devuelve una lista de cadenas resultantes después de cortar la cadena inicial por espacios. Ejemplo:
# la entrada es una cadena # 1 2 3 s = input() # s == '1 2 3' a = s.split() # a == ['1', '2', '3'] print(a)
Si ejecuta este programa con los datos de entrada de 1 2 3
, la lista a
será igual a ['1', '2', '3']
. Tenga en cuenta que la lista constará de cadenas, no de números. Si desea obtener la lista de números, debe convertir los elementos de la lista uno por uno en enteros:
a = input().split() for i in range(len(a)): a[i] = int(a[i]) print(a)
Usando la magia especial de los generadores de Python, lo mismo se puede hacer en una línea:
a = [int(s) for s in input().split()] print(a)
(Explicaremos cómo funciona este código en la próxima sección). Si desea leer una lista de números reales, debe cambiar el tipo int
para float
.
El método split()
tiene un parámetro opcional que determina qué cadena se usará como separador entre los elementos de la lista. Por ejemplo, al llamar al método split('.')
devuelve la lista obtenida al dividir la cadena inicial donde el carácter '.'
se encuentra:
a = '192.168.0.1'.split('.') print(a)
En Python, puede visualizar una lista de cadenas utilizando comandos de una línea. Para eso, se usa el método join
; este método tiene un parámetro: una lista de cadenas. Devuelve la cadena obtenida por la concatenación de los elementos dados, y el separador se inserta entre los elementos de la lista; este separador es igual a la cadena en la que se aplica el método. Sabemos que no entendiste la oración anterior desde la primera vez. :) Mira los ejemplos:
a = ['red', 'green', 'blue'] print(' '.join(a)) # volver rojo verde azul print(''.join(a)) # return redgreenblue print('***'.join(a)) # devuelve rojo *** verde *** azul
Si una lista consta de números, debe usar la magia oscura de los generadores. A continuación, le mostramos cómo puede imprimir los elementos de una lista, separados por espacios:
a = [1, 2, 3] print(' '.join([str(i) for i in a])) # la siguiente línea causa un error de tipo, # como join () solo puede concatenar strs # print ('' .join (a))
Sin embargo, si usted no es un fan de la magia oscura, se puede lograr el mismo efecto utilizando el bucle for
.
3. Generadores
Para crear una lista llena de elementos idénticos, puede usar la repetición de la lista, por ejemplo:
n = 5 a = [0] * n print(a)
Para crear listas más complicadas puede usar generadores : las expresiones que permiten completar una lista de acuerdo con una fórmula. La forma general de un generador es la siguiente:
[expression for variable in sequence]
donde variable
es la ID de alguna variable, la sequence
es una secuencia de valores, que toma la variable (puede ser una lista, una cadena o un objeto obtenido usando el range
funciones), expression
- alguna expresión, generalmente dependiendo de la variable usado en el generador Los elementos de la lista se llenarán de acuerdo con esta expresión.
Aquí hay algunos ejemplos de personas que usan generadores.
Así es como creas una lista de n
ceros usando el generador:
a = [0 for i in range(5)] print(a)
Así es como creas una lista llena de cuadrados de enteros:
n = 5 a = [i ** 2 for i in range(n)] print(a)
Si necesita completar una lista de cuadrados de números desde 1 hasta n
, puede cambiar la configuración del range
al range(1, n + 1)
:
n = 5 a = [i ** 2 for i in range(1, n + 1)] print(a)
A continuación, le mostramos cómo puede obtener una lista llena de números aleatorios del 1 al 9 (usando randrange
del módulo al random
):
from random import randrange n = 10 a = [randrange(1, 10) for i in range(n)] print(a)
Y en este ejemplo, la lista consistirá en líneas leídas desde la entrada estándar: primero, debe ingresar el número de elementos de la lista (este valor se usará como argumento del range
funciones), segundo - ese número de cadenas:
a = [input() for i in range(int(input()))] print(a)
4. Rebanadas
Con listas y cadenas, puede hacer sectores. A saber:
A[i:j]
cortar elementos ji
A[i]
, A[i+1]
, ..., A[j-1]
.
A[i:j:-1]
cortar los elementos ij
A[i]
, A[i-1]
, ..., A[j+1]
(es decir, cambiar el orden de los elementos).
A[i:j:k]
cortado con el paso k
: A[i]
, A[i+k]
, A[i+2*k]
, .... Si el valor de k
<0, los elementos vienen en el orden opuesto.
Puede faltar cada uno de los números i
o j
, lo que significa "el comienzo de la línea" o "el final de la línea"
Las listas, a diferencia de las cadenas, son objetos mutables : puede asignar un elemento de la lista a un nuevo valor. Además, es posible cambiar rebanadas enteras. Por ejemplo:
A = [1, 2, 3, 4, 5] A[2:4] = [7, 8, 9] print(A)
Aquí recibimos una lista [1, 2, 3, 4, 5]
, y luego tratamos de reemplazar los dos elementos del segmento A[2:4]
con una nueva lista de tres elementos. La lista resultante es la siguiente: [1, 2, 7, 8, 9, 5]
.
A = [1, 2, 3, 4, 5, 6, 7] A[::-2] = [10, 20, 30, 40] print(A)
Y aquí, la lista resultante será [40, 2, 30, 4, 20, 6, 10]
. La razón es que A[::-2]
es una lista de elementos A[-1]
, A[-3]
, A[-5]
, A[-7]
, y que los elementos están asignados a 10, 20, 30, 40, respectivamente.
Si a un segmento discontinuo (es decir, un sector con un paso k
, k > 1
) se le asigna un nuevo valor, entonces el número de elementos en los ValueError
viejo y nuevo necesariamente coincide, de lo contrario se produce el error ValueError
.
Tenga en cuenta que A[i]
es un elemento de la lista, ¡no una porción!
5. Operaciones en listas
Puede realizar fácilmente muchas operaciones diferentes con listas.
x en A | Verifique si un artículo en la lista. Devuelve verdadero o falso |
x no en A | Lo mismo que no (x en A) |
min (A) | El elemento más pequeño de la lista |
max (A) | El elemento más grande en la lista |
A.index (x) | El índice de la primera aparición del elemento x en la lista; en su ausencia genera una excepción ValueError |
A.count (x) | El número de ocurrencias del elemento x en la lista |