Una colección ordenada que puedes modificar
Una lista guarda valores en orden entre corchetes: [184.0, 185.5, 183.2]. Puede contener cualquier valor, y len(prices) dice cuántos hay. Cada elemento tiene una posición llamada índice, contada desde 0. Un índice negativo cuenta desde el final, así que -1 es el último elemento. Pedir una posición que no existe lanza un IndexError.
prices = [184.0, 185.5, 183.2, 186.1]
# Reading by position
print(prices[0]) # 184.0
print(prices[-1]) # 186.1
print(len(prices)) # 4
# A list is changeable: assign to a position
prices[1] = 185.0
print(prices) # [184.0, 185.0, 183.2, 186.1]Segmentación: una parte de una lista
prices[start:stop] da una lista nueva desde start hasta stop sin incluirlo. Si omites un extremo, llega hasta ese lado: prices[:3] son los tres primeros, prices[-3:] los tres últimos. Una porción nunca da error por pasarse, simplemente se detiene al final. Una trampa: -0 es igual que 0, así que prices[-0:] es la lista entera, no una vacía.
prices = [184.0, 185.0, 183.2, 186.1, 187.4]
# Slices are new lists
print(prices[1:3]) # [185.0, 183.2]
print(prices[:2]) # [184.0, 185.0]
print(prices[-2:]) # [186.1, 187.4]
# Going past the end is fine, but -0 is not "none"
print(prices[3:99]) # [186.1, 187.4]
print(prices[-0:]) # the whole listAñadir y quitar
append(x) añade un elemento al final, extend(items) añade varios e insert(i, x) pone uno en la posición i. pop() quita y devuelve el último elemento (pop(i) el de i) y remove(x) borra el primer elemento igual a x. Estos métodos modifican la lista en el sitio y devuelven None, así que prices = prices.append(1) deja prices en None. Sumar con + construye en cambio una lista nueva.
# Changing a list in place
fills = [100, 250]
fills.append(75)
fills.extend([40, 60])
print(fills) # [100, 250, 75, 40, 60]
last = fills.pop()
fills.remove(250)
print(last, fills) # 60 [100, 75, 40]
# + builds a new list and leaves the old ones alone
both = fills + [10]
print(both, fills) # [100, 75, 40, 10] [100, 75, 40]Ordenar
Hay dos formas de ordenar. prices.sort() reordena la lista en el sitio y devuelve None. sorted(prices) deja el original intacto y devuelve una lista ordenada nueva; además acepta cualquier iterable. Ambas admiten reverse=True para el mayor primero y key=... para ordenar por otra cosa, como key=len. Prefiere sorted cuando otro código aún pueda usar el orden original.
# sorted() returns a new list, sort() changes the old one
prices = [185.0, 183.2, 187.4, 184.0]
ranked = sorted(prices, reverse=True)
print(ranked) # [187.4, 185.0, 184.0, 183.2]
print(prices) # [185.0, 183.2, 187.4, 184.0] (unchanged)
prices.sort()
print(prices) # [183.2, 184.0, 185.0, 187.4]Dos nombres, una lista
backup = prices no copia la lista: ambos nombres apuntan al mismo objeto, así que cambiar uno cambia el otro. Haz una copia real (superficial) con prices.copy(), list(prices) o la porción prices[:]. Lo mismo vale para las funciones: una función que llama a .append, .sort o .pop sobre su argumento cambia también la lista de quien la llamó, lo que rara vez esperaba.
# A second name is not a copy
prices = [184.0, 185.0]
alias = prices
alias.append(186.0)
print(prices) # [184.0, 185.0, 186.0]
# A real copy is independent
backup = list(prices)
backup.append(187.0)
print(prices) # [184.0, 185.0, 186.0]
print(backup) # [184.0, 185.0, 186.0, 187.0]sorted(...), porciones y comprensiones, que construyen listas nuevas. Los labs comprueban que la lista recibida queda sin cambios.items[i],items[-1]: un elemento;items[a:b]: una lista nueva.append,extend,insert,pop,removecambian la lista y no devuelven nada útil.sorted(items)construye una lista ordenada nueva;items.sort()reordena en el sitio.
A continuación: tuplas y desempaquetado, la hermana de tamaño fijo de la lista y una forma limpia de separar valores.
Lab: qué se califica
- Elegir los precios más altos con
top_n25 pts - Tomar los valores más recientes con
last_n25 pts - Promediar cada ventana de precios con
moving_average25 pts - Mover valores de un extremo a otro con
rotate25 pts