Uma coleção ordenada que você pode alterar
Uma lista guarda valores em ordem entre colchetes: [184.0, 185.5, 183.2]. Pode conter quaisquer valores, e len(prices) diz quantos há. Cada item tem uma posição chamada índice, contada a partir de 0. Um índice negativo conta a partir do fim, então -1 é o último item. Pedir uma posição que não existe gera um 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]Fatiamento: uma parte da lista
prices[start:stop] dá uma nova lista de start até stop, sem incluí-lo. Se omitir uma ponta, vai até ela: prices[:3] são os três primeiros, prices[-3:] os três últimos. Uma fatia nunca dá erro por passar do limite, apenas para no fim. Uma armadilha: -0 é igual a 0, então prices[-0:] é a lista inteira, não uma vazia.
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 listAdicionar e remover
append(x) adiciona um item ao fim, extend(items) adiciona vários e insert(i, x) coloca um na posição i. pop() remove e devolve o último item (pop(i) o da posição i) e remove(x) apaga o primeiro item igual a x. Esses métodos alteram a lista no lugar e devolvem None, então prices = prices.append(1) deixa prices como None. Somar com + constrói uma nova lista.
# 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
Há duas formas de ordenar. prices.sort() reordena a lista no lugar e devolve None. sorted(prices) deixa o original intacto e devolve uma lista ordenada nova; também aceita qualquer iterável. Ambas aceitam reverse=True para o maior primeiro e key=... para ordenar por outra coisa, como key=len. Prefira sorted quando outro código ainda puder usar a ordem 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]Dois nomes, uma lista
backup = prices não copia a lista: os dois nomes apontam para o mesmo objeto, então mudar um muda o outro. Faça uma cópia real (rasa) com prices.copy(), list(prices) ou a fatia prices[:]. O mesmo vale para funções: uma função que chama .append, .sort ou .pop no seu argumento altera também a lista de quem a chamou, o que raramente é esperado.
# 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(...), fatias e comprehensions, que constroem listas novas. Os labs verificam que a lista recebida continua inalterada.items[i],items[-1]: um item;items[a:b]: uma nova lista.append,extend,insert,pop,removealteram a lista e não devolvem nada útil.sorted(items)cria uma nova lista ordenada;items.sort()reordena no lugar.
A seguir: tuplas e desempacotamento, a irmã de tamanho fixo da lista e uma forma limpa de separar valores.
Lab: o que é avaliado
- Escolher os maiores preços com
top_n25 pts - Pegar os valores mais recentes com
last_n25 pts - Calcular a média de cada janela de preços com
moving_average25 pts - Mover valores de uma ponta à outra com
rotate25 pts