Listas de Python

Python tiene un excelente tipo de lista integrado llamado “list”. Los literales de lista se escriben entre corchetes [ ]. Las listas funcionan de manera similar a las cadenas: usa la función len() y corchetes [ ] para acceder a los datos, con el primer elemento en el índice 0. (consulta la documentación oficial de la lista de python.org).

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

lista de cadenas “rojo”, “azul” y “verde”

La asignación con un signo igual en las listas no crea una copia. En cambio, la asignación hace que las dos variables apunten a la única lista en la memoria.

  b = colors   ## Does not copy the list

ambos colores y b apuntan a la lista uno

La “lista vacía” es solo un par vacío de corchetes [ ]. El signo “+” funciona para agregar dos listas, por lo que [1, 2] + [3, 4] produce [1, 2, 3, 4] (es igual a + con cadenas).

FOR y IN

Las construcciones *for* y *in* de Python son muy útiles, y el primer uso que veremos de ellas será con listas. La construcción *for* (for var in list) es una forma sencilla de ver cada elemento de una lista (o de otra colección). No agregues ni quites de la lista durante la iteración.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

Si sabes qué tipo de elementos hay en la lista, usa un nombre de variable en el bucle que capture esa información, como "num", "name" o "url". Dado que el código de Python no tiene otra sintaxis para recordarte los tipos, los nombres de las variables son una forma clave de mantener la claridad de lo que sucede. (Esto es un poco engañoso. A medida que tengas más exposición en Python, verás referencias a sugerencias de tipo que te permiten agregar información de escritura a las definiciones de tu función. Python no usa estas sugerencias de tipo cuando ejecuta tus programas. Otros programas, como los IDE (entornos de desarrollo integrados) y las herramientas de análisis estático, como linters o verificadores de tipos, los usan para validar si se llama a tus funciones con argumentos compatibles.

La construcción *in* por sí sola es una forma fácil de probar si un elemento aparece en una lista (o en otra colección). value in collection prueba si el valor está en la colección y muestra Verdadero o Falso.

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

Las construcciones for/in se usan con mucha frecuencia en el código de Python y funcionan en tipos de datos que no son de lista, por lo que solo debes memorizar su sintaxis. Es posible que tengas hábitos de otros lenguajes en los que empiezas a iterar manualmente una colección, mientras que en Python solo debes usar for/in.

También puedes usar for/in para trabajar en una cadena. La cadena actúa como una lista de sus caracteres, por lo que for ch in s: print(ch) imprime todos los caracteres de una cadena.

Rango

La función range(n) muestra los números 0, 1, … n-1, y range(a, b) muestra a, a+1, … b-1, hasta el último número, pero sin incluirlo. La combinación del bucle for y la función range() te permite compilar un bucle for numérico tradicional:

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

Hay una variante xrange() que evita el costo de compilar toda la lista para casos sensibles al rendimiento (en Python 3, range() tendrá un buen comportamiento de rendimiento y puedes olvidarte de xrange()).

Bucle while

Python también tiene el bucle while estándar, y las sentencias *break* y *continue* funcionan como en C++ y Java, alterando el curso del bucle más interno. Los bucles for/in anteriores resuelven el caso común de iterar sobre cada elemento de una lista, pero el bucle while te brinda control total sobre los números de índice. Este es un bucle while que accede al tercer elemento de una lista:

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

Métodos de lista

Estos son algunos otros métodos de lista comunes.

  • list.append(elem): agrega un solo elemento al final de la lista. Error común: No muestra la lista nueva, solo modifica la original.
  • list.insert(index, elem): Inserta el elemento en el índice determinado y desplaza los elementos hacia la derecha.
  • list.extend(list2) agrega los elementos de list2 al final de la lista. El uso de + o += en una lista es similar al uso de extend().
  • list.index(elem): Busca el elemento determinado desde el principio de la lista y muestra su índice. Genera un ValueError si el elemento no aparece (usa "in" para verificar sin un ValueError).
  • list.remove(elem): Busca la primera instancia del elemento determinado y la quita (muestra un ValueError si no está presente).
  • list.sort(): Ordena la lista en su lugar (no la muestra). (Se prefiere la función sorted(), que se muestra más adelante).
  • list.reverse(): Invierte la lista en el lugar (no la muestra).
  • list.pop(index): Quita y muestra el elemento en el índice dado. Muestra el elemento más a la derecha si se omite el índice (aproximadamente lo opuesto a append()).

Ten en cuenta que estos son *métodos* en un objeto de lista, mientras que len() es una función que toma la lista (o cadena o lo que sea) como argumento.

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

Error común: Ten en cuenta que los métodos anteriores no *muestran* la lista modificada, solo la modifican.

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

Lista de compilaciones

Un patrón común es comenzar una lista como la lista vacía [] y, luego, usar append() o extend() para agregarle elementos:

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

Cómo enumerar Slices

Los cortes funcionan en las listas de la misma manera que con las cadenas y también se pueden usar para cambiar subpartes de la lista.

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

Ejercicio: list1.py

Para practicar el material de esta sección, prueba los problemas de list1.py que no usan la ordenación (en Ejercicios básicos).