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 strings. Usa la función len() y los corchetes [ ] para acceder a los datos. El primer elemento se encuentra en el índice 0. (Consulte los documentos de la lista oficial de python.org).

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

lista de cadenas 'rojo' 'azul 'verde'

Las tareas con un signo = en las listas no crean 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.

La "lista vacía" es solo un par vacío de corchetes [ ]. El signo '+' sirve para agregar dos listas, por lo que [1, 2] + [3, 4] da como resultado [1, 2, 3, 4] (esto es igual que + con cadenas).

PARA e IN

Las construcciones *for* e *in* de Python son extremadamente útiles, y el primer uso de ellas será con listas. La construcción *for*, for var in list, es una manera fácil de ver cada elemento de una lista (u otra colección). No agregues ni quites elementos 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 elemento hay en la lista, usa un nombre de variable en el bucle que capture esa información, como "num", "name" o "url". Debido a que el código de Python no tiene otra sintaxis para recordarte los tipos, los nombres de tus variables son una forma clave de saber lo que está sucediendo. (Esto es un poco engañoso. A medida que tengas más exposición a Python, verás referencias a sugerencias de tipo que te permiten agregar información de escritura a las definiciones de tus funciones. Python no usa estas sugerencias de tipo cuando ejecuta tus programas. Otros programas los usan, como IDE (entornos de desarrollo integrados) y herramientas de análisis estático, como linters o verificadores de tipo, para validar si tus funciones se llaman con argumentos compatibles.

La construcción *in* por sí sola es una manera 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 True/False.

  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 sean listas, por lo que solo debes memorizar su sintaxis. Es posible que tengas hábitos de otros lenguajes en los que comienzas a iterar de forma manual en una colección, mientras que en Python solo debes usar for/in.

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

Rango

La función rango(n) produce los números 0, 1, ... n-1 y rango(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 rango() te permite crear un bucle 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 la lista completa para casos sensibles al rendimiento (en Python 3, rango() tendrá el buen comportamiento de rendimiento, y podrás olvidarte de xrange()).

Bucle while

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

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

Enumerar métodos

A continuación, se muestran otros métodos comunes de list.

  • 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 dado y desplaza los elementos hacia la derecha.
  • list.extend(list2) agrega los elementos en list2 al final de la lista. Usar + o += en una lista es similar a usar extend().
  • list.index(elem): Busca el elemento dado desde el principio de la lista y muestra su índice. Muestra un ValueError si el elemento no aparece (usa "in" para verificar sin un ValueError).
  • list.remove(elem): busca la primera instancia del elemento dado y la quita (arroja ValueError si no está presente)
  • list.sort(): ordena la lista en el lugar (no la devuelve). (Se prefiere la función ordenada() que se muestra más adelante).
  • list.reverse() -- revierte la lista en el lugar (no la devuelve)
  • list.pop(index): Quita y muestra el elemento en el índice determinado. Muestra el elemento más a la derecha si se omite un índice (aproximadamente, lo opuesto a add()).

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 modifican la lista original.

  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]

Creación de listas

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

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

Enumerar Slices

Las Slices funcionan en las listas como 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 utilizan la ordenación (en los Ejercicios básicos).