Wiki Python para dados
Python para dados: listas, dicionários e compreensões
O básico que aparece em todo script de dados: compreensões, contagem por chave, ordenação estável e None.
Os exemplos de Python desta wiki não rodam no navegador (ele não tem Python), mas a saída escrita aqui não é de memória: o teste do site roda cada um com python3 e exige exatamente este texto.
Compreensões
Uma compreensão monta uma lista (ou dicionário, ou conjunto) a partir de outra, com filtro opcional.
pedidos = [
{"id": 101, "cliente": "Ana", "valor": 230.0, "status": "entregue"},
{"id": 103, "cliente": "Ana", "valor": 80.0, "status": "cancelado"},
{"id": 104, "cliente": "Carla", "valor": 180.0, "status": "entregue"},
{"id": 106, "cliente": "Carla", "valor": None, "status": "pendente"},
]
entregues = [p["id"] for p in pedidos if p["status"] == "entregue"]
por_id = {p["id"]: p["valor"] for p in pedidos}
clientes = {p["cliente"] for p in pedidos}
print(entregues)
print(por_id[106])
print(sorted(clientes))Saída (conferida)
[101, 104] None ['Ana', 'Carla']
Contar e somar por chave
collections.Counter conta; defaultdict evita o "se a chave não existe, crie".
from collections import Counter, defaultdict
status = ["entregue", "cancelado", "entregue", "pendente", "entregue"]
print(Counter(status).most_common(2))
total = defaultdict(float)
for cliente, valor in [("Ana", 230.0), ("Carla", 180.0), ("Ana", 900.0)]:
total[cliente] += valor
print(dict(total))Saída (conferida)
[('entregue', 3), ('cancelado', 1)]
{'Ana': 1130.0, 'Carla': 180.0}Ordenar por uma chave
sorted aceita key; para ordem decrescente use reverse=True ou um sinal na chave. A ordenação do Python é estável: empates mantêm a ordem de entrada.
linhas = [("Bruno", 1050.0), ("Ana", 1130.0), ("Diego", 1050.0)]
print(sorted(linhas, key=lambda x: x[1], reverse=True))
print(sorted(linhas, key=lambda x: (-x[1], x[0])))Saída (conferida)
[('Ana', 1130.0), ('Bruno', 1050.0), ('Diego', 1050.0)]
[('Ana', 1130.0), ('Bruno', 1050.0), ('Diego', 1050.0)]None não é zero
None é o NULL do Python, mas a semântica é outra: somar None dá erro em vez de propagar.
valores = [230.0, None, 180.0]
try:
print(sum(valores))
except TypeError as erro:
print("TypeError:", erro)
print(sum(v for v in valores if v is not None))Saída (conferida)
TypeError: unsupported operand type(s) for +: 'float' and 'NoneType' 410.0
- Compare com
is None, não== None(PEP 8). - Em volume, troque o laço em Python por operação vetorizada (pandas, Spark): o laço linha a linha é o que mais custa.
Fontes
Conhecimento compartilhado pela Genesis Innovation.