# Trabalhar com listas

### Trabalhar com listas

Agora que estabelecemos o que é uma lista, vamos falar sobre as operações que podemos realizar nela. Imagine uma lista como um baralho de cartas. O baralho é a lista e cada carta representa um item.

> Foto de [Christian Gidlöf](https://commons.wikimedia.org/wiki/File:Playing_cards_modified.jpg)

### Consultar

Quais **consultas** podemos fazer na lista? Isso acessa as propriedades existentes.

* Número de cartas no baralho? 52.
* Número de naipes? 4.
* Material? Papel.
* Comprimento? 3,5 pol. ou 89 mm.
* Largura? 2,5 pol. ou 64 mm.

### Ação

Quais **ações** podemos executar na lista? Isso altera a lista com base em uma determinada operação.

* Podemos embaralhar as cartas.
* Podemos classificar as cartas por valor.
* Podemos classificar as cartas por naipe.
* Podemos dividir o baralho.
* Podemos dividir o baralho, distribuindo cada uma das mãos da rodada.
* É possível selecionar uma carta específica no baralho.

Todas as operações listadas acima têm nós análogos do Dynamo para trabalhar com listas de dados genéricos. As lições abaixo demonstrarão algumas das operações fundamentais que podemos executar nas listas.

## **Exercício**

### **Operações de lista**

> Faça o download do arquivo de exemplo clicando no link abaixo.
>
> É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.

A imagem abaixo é o gráfico de base no qual estamos desenhando linhas entre dois círculos para representar operações básicas de lista. Vamos explorar como gerenciar dados em uma lista e demonstrar os resultados visuais através das ações da lista abaixo.

!

> 1. Comece com um **Code Block** com um valor de `500;`
> 2. Conecte-se à entrada x de um nó **Point.ByCoordinates**.
> 3. Conecte o nó da etapa anterior à entrada de origem de um nó **Plane.ByOriginNormal**.
> 4. Usando um nó **Circle.ByPlaneRadius**, conecte o nó da etapa anterior à entrada do plano.
> 5. Usando o **Bloco de código**, designe um valor de `50;` para o raio. Esse é o primeiro círculo que criaremos.
> 6. Com um nó **Geometry.Translate**, movimente o círculo 100 unidades para cima na direção Z.
> 7. Com um nó de **Bloco de código**, defina um intervalo de dez números entre 0 e 1 com esta linha de código: `0..1..#10;`
> 8. Conecte o bloco de código da etapa anterior à entrada *parâmetro* de dois nós **Curve.PointAtParameter**. Conecte **Circle.ByPlaneRadius** à entrada de curva do nó superior e **Geometry.Translate** à entrada de curva do nó abaixo dele.
> 9. Usando **Line.ByStartPointEndPoint**, conecte os dois nós **Curve.PointAtParameter**.

### List.Count

> Faça o download do arquivo de exemplo clicando no link abaixo.
>
> É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.

O nó *List.Count* é simples: conta o número de valores em uma lista e retorna esse número. Esse nó ganha mais nuances à medida que trabalhamos com listas de listas, mas vamos demonstrar isso nas seções a seguir.

\![Contagem](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-ptb/.gitbook/assets/working%20with%20list%20-%20list%20operation%20-%20list%20count.jpg)

> 1. O nó **List.Count** retorna o número de linhas no nó **Line.ByStartPointEndPoint**. Neste caso, o valor é 10, que concorda com o número de pontos criados no nó original do **Bloco de código**.

### List.GetItemAtIndex

> Faça o download do arquivo de exemplo clicando no link abaixo.
>
> É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.

{% file src="/files/ArnOCAUSoRJfQpyz81xb" %}

**List.GetItemAtIndex** é uma forma fundamental de consultar um item na lista.

\![Exercício](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-ptb/.gitbook/assets/working%20with%20list%20-%20get%20item%20index%2001.jpg)

> 1. Primeiro, clique com o botão direito do mouse no nó **Line.ByStartPointEndPoint** para desativar sua visualização.
> 2. Usando o nó **List.GetItemAtIndex**, estamos selecionando o índice *“0”* ou o primeiro item na lista de linhas.

Altere o valor do controle deslizante entre 0 e 9 para selecionar outro item usando **List.GetItemAtIndex**.

!

### List.Reverse

> Faça o download do arquivo de exemplo clicando no link abaixo.
>
> É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.

*List.Reverse* inverte a ordem de todos os itens em uma lista.

\![Exercício](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-ptb/.gitbook/assets/working%20with%20list%20-%20list%20reverse.jpg)

> 1. Para visualizar corretamente a lista de linhas invertida, crie mais linhas alterando o **Code Block** para `0..1..#50;`
> 2. Duplique o nó **Line.ByStartPointEndPoint**, insira um nó List.Reverse entre **Curve.PointAtParameter** e o segundo **Line.ByStartPointEndPoint**
> 3. Use os nós **Watch3D** para visualizar dois resultados diferentes. O primeiro mostra o resultado sem uma lista invertida. As linhas se conectam verticalmente aos pontos adjacentes. A lista invertida, no entanto, conectará todos os pontos à ordem oposta na outra lista.

### List.ShiftIndices <a href="#listshiftindices" id="listshiftindices"></a>

> Faça o download do arquivo de exemplo clicando no link abaixo.
>
> É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.

**List.ShiftIndices** é uma boa ferramenta para criar padrões de torções ou helicoidais, ou qualquer outra manipulação de dados semelhante. Esse nó altera os itens em uma lista por um determinado número de índices.

\![Exercício](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-ptb/.gitbook/assets/working%20with%20list%20-%20shiftIndices%2001.jpg)

> 1. No mesmo processo que a lista inversa, insira um **List.ShiftIndices** no **Curve.PointAtParameter** e no **Line.ByStartPointEndPoint**.
> 2. Usando um **Bloco de código**, foi designado o valor de “1” para mudar a lista em um índice.
> 3. Observe que a alteração é sutil, mas todas as linhas no nó inferior **Watch3D** mudaram um índice ao se conectarem ao outro conjunto de pontos.

Se o **Bloco de código** for alterado para um valor maior, *“30”*, por exemplo, perceberemos uma diferença significativa nas linhas diagonais. A mudança está funcionando como a íris da câmera nesse caso, criando uma torção na forma cilíndrica original.

!

### List.FilterByBooleanMask <a href="#listfilterbybooleanmask" id="listfilterbybooleanmask"></a>

> Faça o download do arquivo de exemplo clicando no link abaixo.
>
> É possível encontrar uma lista completa de arquivos de exemplo no Apêndice.

{% file src="/files/7xVn0vi7mhuFirY7K2uL" %}

**List.FilterByBooleanMask** removerá determinados itens com base em uma lista de booleanos ou valores “true” ou “false”.

\![Exercício](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-ptb/.gitbook/assets/working%20with%20list%20-%20filter%20by%20bool%20mask.jpg)

Para criar uma lista de valores “true” ou “false”, é necessário um pouco mais de trabalho...

> 1. Usando um **Bloco de código**, defina uma expressão com a sintaxe: `0..List.Count(list);`. Conecte o nó **Curve.PointAtParameter** à entrada *lista*. Vamos abordar mais essa configuração no capítulo do bloco de código, mas a linha de código nesse caso fornece uma lista que representa cada índice do nó **Curve.PointAtParameter**.
> 2. Usando um nó ***%***\*\* (módulo)\*\*, conecte a saída do *bloco de código* à entrada *x* e um valor de *4* à entrada *y*. Isso vai gerar o resto ao dividir a lista de índices por 4. O módulo é um nó muito útil para a criação do padrão. Todos os valores serão lidos como os possíveis restos de 4: 0, 1, 2, 3.
> 3. No nó ***%***\*\* (módulo)\*\*, sabemos que um valor de 0 significa que o índice é divisível por 4 (0, 4, 8 etc...). Usando um nó **==**, podemos testar a divisibilidade com um valor de *“0”*.
> 4. O nó **Watch** revela apenas isso: temos um padrão true/false com a indicação: *true,false,false,false...*.
> 5. Usando esse padrão true/false, conecte-se à entrada de máscara dos dois nós **List.FilterByBooleanMask**.
> 6. Conecte o nó **Curve.PointAtParameter** a cada entrada da lista do **List.FilterByBooleanMask**.
> 7. A saída de **Filter.ByBooleanMask** é *“in”* e *“out”*. *“In”* representa valores que tinham um valor de máscara *“true”*, enquanto *“out”* representa valores que tinham um valor *“false”*. Conectando as saídas *“in”* às entradas *startPoint* e *endPoint* de um nó **Line.ByStartPointEndPoint**, criamos uma lista de linhas filtrada.
> 8. O nó **Watch3D** revela que temos menos linhas do que pontos. Selecionamos somente 25% dos nós filtrando somente os valores true.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://primer2.dynamobim.org/pt-br/5_essential_nodes_and_concepts/5-4_designing-with-lists/2-working-with-lists.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
