Pular para o conteúdo

Conjuntos

O tipo Set: o literal {1, 2}, set(xs), a compreensão, as operações — e por que um Cluster não entra nele.

Um conjunto guarda valores sem repetição e sem ordem, e responde uma pergunta em tempo constante: este valor está aqui?. É o tipo certo para uma lista de permissões, para tirar duplicatas, e para comparar dois grupos.

dataforge
cores := {"azul", "verde", "azul"}      // a repeticao some
assert len(cores) is 2
assert "verde" in cores
assert typeof(cores) is "Set"

vazio := set()                           // '{}' e o vault vazio
assert typeof(vazio) is "Set" and typeof({}) is "Vault"

assert set([3, 1, 3, 2]) is {1, 2, 3}   // de uma lista
assert {n % 3 cycle n in range(0, 10)} is {0, 1, 2}   // compreensao

xs := [1, 2]
assert {...xs, 9} is {1, 2, 9}           // espalhando
out cores                                // sai em ordem: {azul, verde}

As operações#

dataforge
dev := {"ana", "bia", "caio"}
ops := {"bia", "davi"}

assert dev.union(ops) is {"ana", "bia", "caio", "davi"}        // em qualquer um
assert dev.intersection(ops) is {"bia"}                        // nos dois
assert dev.difference(ops) is {"ana", "caio"}                  // so no primeiro
assert dev.symmetric_difference(ops) is {"ana", "caio", "davi"}
assert {"bia"}.issubset(dev)

dev.add("eva")
dev.discard("ninguem")      // 'discard' nao reclama do que nao existe
assert len(dev) is 4

Anotar o tipo#

dataforge
permitidos: Set<String> := {"admin", "editor"}
assert "admin" in permitidos
// permitidos: Set<String> := {1} — recusado em execucao
// e o 'check' conhece 'Set' e 'Set<T>'

Quando usar#

PerguntaTipoCusto de x in …
este valor está aqui?, muitas vezesSetO(1)
qual é o terceiro?, em que ordem?ClusterO(n)
quanto vale esta chave?VaultO(1)

A diferença do in aparece com volume: ver Estruturas.