Python - Lección 7: Secuencias (listas)

Secuencias (listas)

Hasta ahora vimos el tipo más básico de variables dentro del lenguaje, ahora nos toca subir un poquito el volúmen y continuar con el resto de las variables que utilizaremos para programar.
En el primer lugar, tenemos a las listas. Imagina que necesitamos almacenar muchos datos y por la enorme o indefinida cantidad de los mismos nos resultaría difícil especificar una variable para cada dato en específico. Es en este momento en donde necesitamos de las secuencias. Estas, son variables que pueden almacenar uno o incontables datos dentro de sí mismas, podemos añadir más elementos, quitarlos o trabajarlos según nuestra conveniencia.
Vamos a comenzar con un ejemplo para mostrar su sintáxis y en qué consisten.

mi_primera_lista = ['Elemento1', 2, 3.4]
print (mi_primera_lista)

Como ven, las listas pueden almacenar datos de diferentes tipos separados entre sí por comas. Estos datos, deben contenerse entre llaves cuadradas y los que sean de tipo string, como siempre entre comillas.

Otra particularidad de las secuencias, es que pueden contener más secuencias adentro, de esta manera, nuestros datos estarán agrupados y organizados dentro de una sóla variable.

autos = [['Mitsubishi EVO X', 2009], ['Ford Mustang', 2018], ['Chevrolet El Camino', 1986]]

print (autos)

Con la función list(), podemos convertir una cadena string en elementos de una lista, en donde cada caracter del string es un elemento diferente dentro de la misma.

mi_lista = list('123456789')

print(mi_lista)

Podemos elegir la cantidad de elementos de la lista que queremos imprimir detallando el índice o el rango de índices de los elementos de dicha lista dentro de llaves cuadradas (El primer índice comienza en 0).

mi_lista = list('LinuxChad')

print (mi_lista[0])
print (mi_lista[1:4])
print (mi_lista[:4])
print [mi_lista[5:]]

También podemos combinar los elementos de dos listas para formar una nueva.

mi_lista = list('01234')
nueva_lista = list('56789')

print (mi_lista + nueva_lista)

secuencias08

Ahora vamos a ver cómo reemplazar, añadir y remover elementos de las listas respectivamente.

mi_lista = list('012345')
print (mi_lista)

mi_lista[1] = '5ombr4'
print (mi_lista)

mi_lista.append = 236
print (mi_lista)

mi_lista.pop(5)
print (mi_lista)

Lo siguiente es ver cómo ordenar las listas. Como ejemplo, vamos a usar una lista con elementos del tipo string y otra con valores enteros.

`strings_desordenados = ['z','c','d','a','b','g','l','j','h']
print (f'Lista de caracteres desordenados: {strings_desordenados}')
strings_desordenados.sort()
print (f'Lista de caracteres ordenados: {strings_desordenados}')

enteros_desordenados = ['3','1','14','9','17','0','4','7']
print (f'Lista de enteros desordenados: {enteros_desordenados}')
enteros_desordenados.sort()
print (f'Lista de enteros ordenados: {enteros_desordenados}')

NOTA: Si queremos invertir el orden de una lista, debemos utilizar el comando .reverse()

Para finalizar con el tema, voy a dejarles una lista de operaciones que pueden realizar con las listas.

<Tema anterior - Siguiente tema>

7 Me gusta

Probando los comandos, he encontrado lo que creo que es un error aquí:

Cuando intento usarlo así, como .append=valor, la terminal me arroja un error . Cuando lo uso como en el ejemplo, como .append(valor), sí funciona.

Sigo estudiando. Gracias por el curso. :wink:

1 me gusta

Curioso, a mí no me arroja error.
Bueno, me alegro que hayas encontrado una forma de que te funcione.

1 me gusta

Más cositas:

Puedo usar len(lista) sin problema, pero en todos los intentos que he hecho de usar lista.len() me da error. He probado con listas simples y anidadas, con una lista1 como elemento de una lista2 ( lista1=[‘uno’, ‘dos’, ‘tres’] lista2=[‘algo’, ‘nada’, lista1, ‘paco’] ). El terminal me dice que “.len no es un atributo de lista”.
Pego un ejemplo de lo que he intentado:

lista1=['uno', 'dos', 'tres']
lista2=['algo', 'nada', lista1, 'paco']
# print(lista1.len())
# print(lista1.len(0))
# print(lista2.len(2))
# print(lista2.len(lista1))

NOTA: Los # de comentario son para que permita continuar la ejecución. Hay que descomentar cada línea que se quiera probar.
En todas ellas da el mismo error. No sé qué estoy haciendo mal.

Hola, la manera correcta de usar len() es:

len(lista1) # retorna 3
len(lista2) # retorna 4

Puedes ver la descripción de la función de la siguiente manera:

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

No puede ser lista1.len() por cuestiones de diseño. len() es una metodo built-in (o metodo magico) en Python que funciona con muchos tipos de datos distintos (creo que solo los built-in). Por ejemplo, puedes obtener la longitud de una tupla con el mismo len():

mi_tupla = (1, 2, 3)
print(len(mi_tupla)) # retorna 3

Si quieres consultar los métodos y atributos de cierta estructura de datos, puedes usar la función dir():

>>> print(dir(lista1))
['__add__', '__class__', '__class_getitem__', '__contains__', 
'__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__getitem__', 
'__gt__', '__hash__', '__iadd__', '__imul__', '__init__', 
'__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', 
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__reversed__', '__rmul__', '__setattr__', 
'__setitem__', '__sizeof__', '__str__', '__subclasshook__', 
'append', 'clear', 'copy', 'count', 'extend', 'index', 
'insert', 'pop', 'remove', 'reverse', 'sort']

Entonces, lista1.__len__() es lo que buscas, este es un metodo definido especificamente en la clase list


Desventajas? no es tan legible como len(lista(1).

Saludos y happy hacking!

1 me gusta

Si te fijas bien, abajo de esa parte está la manera correcta de hacerlo. Honestamente no se porque está dos veces, una bien y otra mal.

En la primer columna de la tabla de funciones y propiedades de las listas, tiene una simbología que voy a explicar a continuación:

  • X: Se refiere a un elemento dentro de la lista.
  • A: Hace referencia a la propia lista.
  • i: Valor de inicio de recorrido.
  • j: Valor de cierre del recorrido.
  • k: Valor de saltos en el recorrido.

Ahora no tengo la PC a mano, ni bien pueda, subo un repaso y unos ejemplos más para que se entienda mejor.

Muchas gracias. Eso resuelve completamente mi duda, y varias más. :wink:
Para empezar, saber que existe help(función) me ayudará mucho, porque los buscadores cada día funcionan peor (ayer mismo estuve buscando sobre list y no encontré nada).
No sé ni lo que es un “método”, ni sé trabajar con objetos. En mis tiempos, lo más complejo que había eran las subrutinas (gosub, del BASIC). Llevo unos 30 años de retraso. :sweat_smile:

Ahora estoy un poco atascado con las tuplas, pero seguiré dedicando mis ratos libres a avanzar con tu magnífico curso. Estoy deseando llegar a los bucles y los condicionales, que es cuando se pueden empezar a hacer cosas interesantes. ¡Muchas gracias!

Mira, te recomiendo tener siempre a mano w3schools, no solo por Python, sino por cualquier lenguaje que quieras aprender.
Es una página en donde explica cada función principal del lenguaje, da ejemplos, tiene su propio curso básico. A mí me ayuda mucho como ayuda memoria con las etiquetas de HTML, cosa que toco muy poco y siempre tengo que estar buscando que hacia cada cosa :joy:

1 me gusta

Me puse a probar cosas con las listas y vi que pasa algo curioso.

  1. Es posible imprimir los elementos ingresando la posición con números negativos.
  2. No es posible referirlos con números negativos retrocediendo indefinidamente. En el caso del ejemplo, {lista[0:-10]}, y print(lista[-10]) genera un mensaje de error, de modo que solo se permite una regresión.
  3. El contenido y no la posición dicta si la lista se imprime correctamente o no. El contenido debe ir siempre en orden ascendente, aun si la posición no lo hace. En el ejemplo, {lista[3:-2]} y {lista[-6:-2]} tienen el mismo resultado aunque la posición del primer elemento varía.
#             012345678
lista = list(‘123456789’)
# lista:    1  2  3  4  5  6  7  8  9
#          -9 -8 -7 -6 -5 -4 -3 -2 -1

print(f'''
{lista}         # Lista completa.
{lista[8]}      # Da 9.
{lista[-2]}     # Da 8.
{lista[-9]}     # Da 1.
{lista[-0]}     # Da 1.
{lista[-0:0]}   # Corchetes vacíos.
{lista[0:-0]}   # Corchetes vacíos.
{lista[-0:-0]}  # Corchetes vacíos.
{lista[0:-9]}   # Corchetes vacíos.
{lista[0:-8]}   # Da 1.
{lista[0:-10]}  # Corchetes vacíos.
{lista[8:0]}    # Corchetes vacíos. No imprime lista al revés,usar .reverse()
{lista[3:-2]}   # 4, 5, 6, 7.
{lista[-2:3]}   # Corchetes vacíos.
{lista[-2:-6]}  # Corchetes vacíos. No imprime lista al revés,usar .reverse()
{lista[-6:-2]}  # 4, 5, 6, 7.
{lista[0:-12]}  # Corchetes vacíos.
''')

# print(lista[-10]) da error (fuera de rango); lo mismo para el resto de núms.
# menores. En los casos donde se refiere a estos junto con otro núm. dentro
# del rango, se imprime corchetes vacíos porque uno de ellos está fuera.

Mientras escribía esto y revisaba el cuadro de arriba, me respondí unas dudas y creo que no está de más anotarlas junto con mi ensayo de respuesta.

  • Porqué {lista[-0:0]}, {lista[0:-0]} y {lista[-0:-0]} no imprimen el contenido y {lista[-0]} sí.

{lista[-0]} imprime el contenido porque no existe el negativo de 0, de modo que Python lo interpreta como 0 sin más.{lista[-0:0]}, {lista[0:-0]} y {lista[-0:-0]} no imprimen porque se está pidiendo un rango que no existe en la lista, 0 y -0 refieren al mismo elemento.

  • Por lo que vi, al imprimir un rango se incluye la primera posición y se excluye la segunda. Por ejemplo, si pido imprimir {lista[0:3]} el resulado sería [1, 2, 3]; es decir, parece depender enteramente de la posición. Pero algo diferente pasa cuando se usan números negativos, como en {lista[0:-8]}

Esto se responde con el punto 3.

1 me gusta

Excelente! Aunque hay una manera de imprimir la lista en orden inverso :wink:

Pues busqué cómo, con la indicación de “salto“: {lista[::-1]}, correcto?

1 me gusta

Excelente! :ok_hand:t4::ok_hand:t4::ok_hand:t4:

Eso te va a ayudar cuando necesites imprimir registros traídos de la base de datos empezando a mostrar por el último.

Yo lo uso en una aplicación web que hice, específicamente en el sistema de gestión de tickets y asistencia técnica. De esa manera siempre me empieza a listar por los últimos y no tengo que ir hasta el fondo.

2 Me gusta