Pular para o conteúdo

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 dois
saí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 stream

Vaults#

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 lista

Inverter 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çãoPrefira
um filtro e uma transformaçãocompreensão
três ou mais estágiospipeline
duas fontes combinadascompreensão
termina com uma reduçãopipeline (distill)
lógica com vários passoslaç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.