Compreensões
Construir listas e vaults numa expressão, transformando e filtrando.
A forma#
text
[ <expressão> cycle <nome> in <fonte> [given <condição>] ]
{ <chave>: <valor> cycle <nome> in <fonte> [given <condição>] }Lê-se: "a expressão, para cada nome na fonte, dado que a condição vale".
Listas#
dataforge
nums := [1, 2, 3, 4, 5, 6]
out [n * n cycle n in nums] # transforma
out [n cycle n in nums given n % 2 is 0] # filtra
out [n * 2 cycle n in nums given n % 2 is 1] # os doissaída
[1, 4, 9, 16, 25, 36]
[2, 4, 6]
[2, 6, 10]Sobre outras fontes#
dataforge
out [c.upper() cycle c in "dataforge" given c isnt "a"] # sobre texto
out [k cycle k in {"a": 1, "b": 2}] # sobre as chaves
out [x * 10 cycle x in contar(4)] # sobre um streamVaults#
dataforge
out {n: n * n cycle n in [1, 2, 3]} # {1: 1, 2: 4, 3: 9}Três usos que valem memorizar#
Indexar por um campo — de busca linear para acesso direto, numa linha:
dataforge
pessoas := [{"id": 10, "nome": "Ana"}, {"id": 20, "nome": "Bruno"}]
por_id := {p["id"]: p["nome"] cycle p in pessoas}
out por_id[20] # Bruno — sem varrer a listaInverter um dicionário:
dataforge
originais := {"a": 1, "b": 2}
out {originais[k]: k cycle k in originais.keys()} # {1: a, 2: b}Normalizar chaves vindas de fora:
dataforge
bruto := {" Nome ": "Ana", "IDADE": 30}
out {k.trim().lower(): bruto[k] cycle k in bruto.keys()}Múltiplas fontes#
dataforge
out [$"{a}x{b}={a * b}" cycle a in [2, 3] cycle b in [1, 2, 3]]O cycle da direita gira mais rápido — é o laço interno. O resultado tem 2 × 3 = 6 itens.
Escopo#
A variável do cycle não vaza:
dataforge
_ := [i cycle i in [1, 2]]
out i # erro: Undefined name 'i'Isso evita o bug clássico de reaproveitar sem querer o i de uma compreensão anterior.
Compreensão ou pipeline?#
dataforge
[n * 2 cycle n in nums given n % 2 is 1]
nums >> sift n: n % 2 is 1 >> morph n: n * 2| Situação | Prefira |
|---|---|
| um filtro e uma transformação | compreensão |
| três ou mais estágios | pipeline |
| duas fontes combinadas | compreensão |
| termina com uma redução | pipeline (distill) |
| lógica com vários passos | laço cycle |
A compreensão diz o que você quer; o laço diz como obter. Para transformações simples, a primeira é mais direta — mas não force tudo numa linha.