# Praca z listami

### Praca z listami

Ustaliliśmy już, czym jest lista. Omówmy teraz operacje, które możemy na niej wykonać. Wyobraź sobie listę jako talię kart do gry. Talia jest listą, a każda karta reprezentuje element.

> Autor zdjęcia: [Christian Gidlöf](https://commons.wikimedia.org/wiki/File:Playing_cards_modified.jpg)

### Zapytanie

Jakie **zapytania** możemy wykonać z poziomu listy? Umożliwia to dostęp do istniejących właściwości.

* Liczba kart w talii? 52.
* Liczba kolorów? 4.
* Materiał? Papier.
* Długość? 3,5" lub 89 mm.
* Szerokość? 2,5" lub 64 mm.

### Działanie

Jakie **działania** możemy wykonać na liście list? Umożliwia to zmianę listy w oparciu o daną operację.

* Możemy potasować talię.
* Możemy posortować talię według wartości.
* Możemy posortować talię według kolorów.
* Możemy podzielić talię.
* Możemy rozdać karty w talii.
* Możemy wybrać określoną kartę w talii.

Dla wszystkich operacji wymienionych powyżej istnieją analogiczne węzły Dynamo do pracy z listami danych ogólnych. W poniższych lekcjach przedstawiono niektóre z podstawowych operacji, które można wykonywać na listach.

## **Ćwiczenie**

### **Operacje na listach**

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

Poniższy rysunek przedstawia wykres bazowy, na którym rysujemy linie między dwoma okręgami, aby przedstawić podstawowe operacje na listach. Przeanalizujemy sposób zarządzania danymi na liście i przedstawimy wyniki wizualne za pomocą poniższych operacji na liście.

!

> 1. Rozpocznij od węzła **Code Block** o wartości `500;`
> 2. Połącz wejście x z węzłem **Point.ByCoordinates**.
> 3. Podłącz węzeł z poprzedniego kroku do wejścia origin węzła **Plane.ByOriginNormal**.
> 4. Za pomocą węzła **Circle.ByPlaneRadius** podłącz węzeł z poprzedniego kroku do wejścia plane.
> 5. Używając węzła **Code Block**, oznacz wartość `50;` dla pozycji radius. To pierwszy okrąg, który utworzymy.
> 6. Za pomocą węzła **Geometry.Translate** przesuń okrąg w górę o 100 jednostek w kierunku Z.
> 7. Za pomocą węzła **Code Block** zdefiniuj zakres dziesięciu liczb z zakresu od 0 do 1 przy użyciu tego wiersza kodu: `0..1..#10;`
> 8. Wstaw blok kodu z poprzedniego kroku do wejścia *param* dwóch węzłów **Curve.PointAtParameter**. Podłącz węzeł **Circle.ByPlaneRadius** do wejścia curve górnego węzła i węzeł **Geometry.Translate** do wejścia curve węzła poniżej.
> 9. Za pomocą węzła **Line.ByStartPointEndPoint** połącz dwa węzły **Curve.PointAtParameter**.

### List.Count

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

Węzeł *List.Count* jest prosty: zlicza wartości na liście i zwraca ich liczbę. Jego działanie jest nieco bardziej złożone podczas pracy z listami list, ale zilustrujemy to w późniejszych sekcjach.

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

> 1. Węzeł **List.Count** zwraca liczbę linii w węźle **Line.ByStartPointEndPoint**. W tym przypadku wynosi ona 10, co odpowiada liczbie punktów utworzonych z oryginalnego węzła **Code Block**.

### List.GetItemAtIndex

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

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

Węzeł **List.GetItemAtIndex** zapewnia podstawowy sposób stosowania zapytania dotyczącego elementu listy.

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

> 1. Najpierw kliknij prawym przyciskiem myszy węzeł **Line.ByStartPointEndPoint**, aby wyłączyć jego podgląd.
> 2. Za pomocą węzła **List.GetItemAtIndex** wybieramy indeks *„0”*, czyli pierwszy element na liście linii.

Zmień wartość suwaka na od 0 do 9, aby wybrać inny element za pomocą węzła **List.GetItemAtIndex**.

!

### List.Reverse

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

Węzeł *List.Reverse* odwraca kolejność wszystkich elementów na liście.

\![Ćwiczenie](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-plk/.gitbook/assets/working%20with%20list%20-%20list%20reverse.jpg)

> 1. Aby poprawnie zwizualizować odwróconą listę linii, utwórz więcej linii, zmieniając węzeł **Code Block** na `0..1..#50;`
> 2. Powiel węzeł **Line.ByStartPointEndPoint** oraz wstaw węzeł List.Reverse między węzłem **Curve.PointAtParameter** i drugim węzłem **Line.ByStartPointEndPoint**
> 3. Użyj węzłów **Watch3D**, aby wyświetlić podgląd dwóch różnych wyników. Pierwszy pokazuje wynik bez odwróconej listy. Linie łączą się pionowo z sąsiednimi punktami. Natomiast odwrócona lista powoduje połączenie wszystkich punktów w kolejności odwrotnej na drugiej liście.

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

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

Węzeł **List.ShiftIndices** jest dobrym narzędziem do tworzenia skrętów lub wzorców śrubowych albo do innych podobnych manipulacji danymi. Ten węzeł przesuwa elementy na liście o podaną wartość indeksu.

\![Ćwiczenie](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-plk/.gitbook/assets/working%20with%20list%20-%20shiftIndices%2001.jpg)

> 1. W tym samym procesie, w którym występuje odwrócona lista, wstaw węzeł **List.ShiftIndices** do węzłów **Curve.PointAtParameter** i **Line.ByStartPointEndPoint**.
> 2. Używając węzła **Code Block**, określ wartość „1”, aby przesunąć listę o jeden indeks.
> 3. Zauważmy, że zmiana jest subtelna, ale wszystkie linie w dolnym węźle **Watch3D** przesunęły się o jeden indeks podczas łączenia się z drugim zestawem punktów.

Po zmianie wartości w węźle **Code Block** na większą, na przykład *„30”*, zauważamy znaczną różnicę w liniach ukośnych. W tym przypadku przesunięcie działa jak obiektyw aparatu, tworząc skręt w oryginalnej formie walcowej.

!

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

> Pobierz plik przykładowy, klikając poniższe łącze.
>
> Pełna lista plików przykładowych znajduje się w załączniku.

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

Węzeł **List.FilterByBooleanMask** usuwa niektóre elementy w oparciu o listę wartości logicznych lub wartości odczytywanych jako „true” lub „false”.

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

Aby utworzyć listę wartości odczytywanych jako „true” lub „false”, musimy wykonać nieco więcej pracy.

> 1. Używając węzła **Code Block**, zdefiniuj wyrażenie ze składnią: `0..List.Count(list);`. Połącz węzeł **Curve.PointAtParameter** z wejściem *list*. Przeanalizujemy tę konfiguracje dokładniej w rozdziale dotyczącym węzła Code Block, ale wiersz kodu w tym przypadku tworzy listę reprezentującą każdy indeks węzła **Curve.PointAtParameter**.
> 2. Używając węzła ***%***\*\* (moduł)\*\*, połącz wyjście węzła *Code Block* z wejściem *x* oraz wartość *4* z wejściem *y*. Spowoduje to zwrócenie reszty z dzielenia listy indeksów przez 4. Węzeł modułu jest bardzo przydatny podczas tworzenia szyku. Wszystkie wartości będą odczytywane jako możliwe reszty z dzielenia przez 4, czyli 0, 1, 2 i 3.
> 3. Na podstawie węzła ***%***\*\* (moduł)\*\* wiemy, że wartość 0 oznacza, iż indeks jest podzielny przez 4 (0, 4, 8 itd...). Za pomocą węzła **==** możemy sprawdzić tę dzielność, testując tę pozycję pod kątem wartości *„0”*.
> 4. Węzeł **Watch** pokazuje tylko, że mamy wzorzec true/false, który wygląda następująco: *true,false,false,false...*.
> 5. Używając tego wzorca true/false, utwórz połączenie z wejściem mask dwóch węzłów **List.FilterByBooleanMask**.
> 6. Połącz węzeł **Curve.PointAtParameter** z każdym wejściem list węzła **List.FilterByBooleanMask**.
> 7. Wyjścia węzła **Filter.ByBooleanMask** to *„in”* oraz *„out”*. Wyjście *„in”* reprezentuje wartości, które miały wartość maski *„true”*, a wyjście *„out”* — wartość maski *„false”*. Podłączając wyjścia *„in”* do wejść *startPoint* i *endPoint* węzła **Line.ByStartPointEndPoint**, utworzyliśmy przefiltrowaną listę linii.
> 8. Węzeł **Watch3D** pokazuje, że mamy mniej linii niż punktów. Wybraliśmy tylko 25% węzłów, filtrując tylko wartości 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/pl/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.
