<commit_before>---
layout: page
title: Kolekcje
category: basics
order: 2
lang: pl
---

Listy, krotki, listy asocjacyjne, mapy i kombinatory funkcyjne.

{% include toc.html %}

## Listy

Listy to proste zbiory nieunikalnych wartości różnych typów:

```elixir
iex> [3.14, :pie, "Apple"]
[3.14, :pie, "Apple"]
```

Elixir implementuje listę jako listę wiązaną.  Oznacza to, że obliczenie rozmiaru listy ma złożoność `O(n)`.  Dlatego też szybsze jest dołączanie elementów na początku niż na końcu listy:

```elixir
iex> list = [3.14, :pie, "Apple"]
[3.14, :pie, "Apple"]
iex> ["π"] ++ list
["π", 3.14, :pie, "Apple"]
iex> list ++ ["Cherry"]
[3.14, :pie, "Apple", "Cherry"]
```


### Łączenie list

Do łączenia list służy operator `++/2`:

```elixir
iex> [1, 2] ++ [3, 4, 1]
[1, 2, 3, 4, 1]
```

### Usuwanie elementów

Usuwanie elementów wykonuje operator `--/2`; operacja jest bezpieczna, jeżeli chcemy usunąć nieistniejący element:

```elixir
iex> ["foo", :bar, 42] -- [42, "bar"]
["foo", :bar]
```

**Uwaga:** Operacja używa [dokładnego porównania](../basics/#comparison) przy wyszukiwaniu wartości.

### Głowa i ogon

Pracując z listami, będziemy często używać pojęć głowa i ogon.  Głowa jest to pierwszy element listy, a ogon to pozostałe elementy.  Elixir ma dwie pomocne metody, `hd` i `tl`, które pomagają w pracy z tymi elementami:

```elixir
iex> hd [3.14, :pie, "Apple"]
3.14
iex> tl [3.14, :pie, "Apple"]
[:pie, "Apple"]
```

Poza wyżej wymienionymi funkcjami możemy też użyć operatora `|`; spotkamy się z nim w kolejnych lekcjach:

```elixir
iex> [h|t] = [3.14, :pie, "Apple"]
[3.14, :pie, "Apple"]
iex> h
3.14
iex> t
[:pie, "Apple"]
```

_Uwaga_: znak `|` w tym przypadku oznacza operator _cons_ (od ang. _construct_) – tworzenia, a nie operator _pipe_ – łączenia.  

## Krotki

Krotki są podobne do list, ale zajmują ciągły obszar pamięci.  Powoduje to, że odczyt jest bardzo szybki, lecz kodyfikacja kosztowna; zmiana wartości oznacza stworzenie nowej krotki i skopiowanie elementów starej.  Krotki definiujemy za pomocą klamer:<commit_msg>[PL] #642 add duplicates case (#675)<commit_after>---
layout: page
title: Kolekcje
category: basics
order: 2
lang: pl
---

Listy, krotki, listy asocjacyjne, mapy i kombinatory funkcyjne.

{% include toc.html %}

## Listy

Listy to proste zbiory nieunikalnych wartości różnych typów:

```elixir
iex> [3.14, :pie, "Apple"]
[3.14, :pie, "Apple"]
```

Elixir implementuje listę jako listę wiązaną.  Oznacza to, że obliczenie rozmiaru listy ma złożoność `O(n)`.  Dlatego też szybsze jest dołączanie elementów na początku niż na końcu listy:

```elixir
iex> list = [3.14, :pie, "Apple"]
[3.14, :pie, "Apple"]
iex> ["π"] ++ list
["π", 3.14, :pie, "Apple"]
iex> list ++ ["Cherry"]
[3.14, :pie, "Apple", "Cherry"]
```


### Łączenie list

Do łączenia list służy operator `++/2`:

```elixir
iex> [1, 2] ++ [3, 4, 1]
[1, 2, 3, 4, 1]
```

### Usuwanie elementów

Usuwanie elementów wykonuje operator `--/2`; operacja jest bezpieczna, jeżeli chcemy usunąć nieistniejący element:

```elixir
iex> ["foo", :bar, 42] -- [42, "bar"]
["foo", :bar]
```

Jeżeli na liście występują duplikaty, to zostanie usunięty pierwszy z nich:

```elixir
iex> [1,2,2,3,2,3] -- [1,2,3,2]
[2, 3]
```

**Uwaga:** Operacja używa [dokładnego porównania](../basics/#comparison) przy wyszukiwaniu wartości.

### Głowa i ogon

Pracując z listami, będziemy często używać pojęć głowa i ogon.  Głowa jest to pierwszy element listy, a ogon to pozostałe elementy.  Elixir ma dwie pomocne metody, `hd` i `tl`, które pomagają w pracy z tymi elementami:

```elixir
iex> hd [3.14, :pie, "Apple"]
3.14
iex> tl [3.14, :pie, "Apple"]
[:pie, "Apple"]
```

Poza wyżej wymienionymi funkcjami możemy też użyć operatora `|`; spotkamy się z nim w kolejnych lekcjach:

```elixir
iex> [h|t] = [3.14, :pie, "Apple"]
[3.14, :pie, "Apple"]
iex> h
3.14
iex> t
[:pie, "Apple"]
```

_Uwaga_: znak `|` w tym przypadku oznacza operator _cons_ (od ang. _construct_) – tworzenia, a nie operator _pipe_ – łączenia.  

## Krotki

Krotki są podobne do list, ale zajmują ciągły obszar pamięci.  Powoduje to, że odczyt jest bardzo szybki, lecz kodyfikacja kosztowna; zmiana wartości oznacza stworzenie nowej krotki i skopiowanie elementów starej.  Krotki definiujemy za pomocą klamer:
{'fraction_non_alphanumeric': 0.1516431924882629, 'fraction_numerical': 0.02910798122065728, 'mean_word_length': 4.540962288686606, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3930124', 'n_tokens_mistral': 2014, 'n_tokens_neox': 1966, 'n_words': 579}