Proposta de site feita pela Genesis Innovation · conteúdo do LinkedIn de Daniel Santos

Pular para o conteúdo
Daniel Santos

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.

PythonSaída conferida rodando Python 3 no teste do site.
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".

PythonSaída conferida rodando Python 3 no teste do site.
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.

PythonSaída conferida rodando Python 3 no teste do site.
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.

PythonSaída conferida rodando Python 3 no teste do site.
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.