# Seturi

**Setul** se utilizează pentru a stoca colecții de date. Un set e o colecție de date **neordonată** și **neindexată**.

Pentru a înțelege mai bine seturile trebuie să cunoașteți că acesta reprezintă noțiunea matematică a unei *mulțimi*.

```python
this_set = {"apple", "banana", "cherry"}
print(this_set)
```

{% hint style="info" %}
&#x20;Elementele setului sunt *neordonate* și *nu permit valori duplicate*.
{% endhint %}

**Elemente neordonate** înseamnă că elementele dintr-un set nu au o ordine definită. Acestea pot apărea într-o ordine diferită de fiecare dată când le utilizați și nu pot fi apelate sau modificate prin index.

{% hint style="warning" %}
**Nu pot avea Valori duplicate** - Seturile nu pot avea două elemente cu aceeași valoare.
{% endhint %}

*Însă avantajul major al unui set, spre deosebire de o listă, este că are o metodă extrem de optimizată pentru a verifica dacă un anumit element se conține în set.*

### Intro

```python
#elemente neordonate
this_set = {"apple", "banana", "cherry"}
print(this_set[1]) # error
```

```python
#nu pot avea valori duplicate, valorile duplicate sunt ignorate
this_set = {"apple", "banana", "cherry", "apple"}

print(this_set)
```

**Elementele setului** pot fi de orice tip de date. La fel un set poate conține diferite tipuri de date. Tipul de date în așa fel de seturi este '`set`'

```python
set1 = {"apple", "banana", "cherry"}
set2 = {1, 5, 7, 9, 3}
set3 = {True, False, False}
set4 = {"abc", 34, True, 40, "male"}
```

### Set gol

```python
a = set()
```

### Accesarea elemetelor

{% hint style="info" %}
Accesarea elementelor in set se produce numai in ciclu ( setul nu este ordonat)
{% endhint %}

```python
girls = {"Ana", "Aurelia", "Maria"} 

for name in girls:
    print(name)
```

### Verificarea prezenței unui element în set

```python
girls = {"Ana", "Aurelia", "Maria"} 

print("Anastasia" in girls) #False
print("Ana" in girls) #True
```

### Adăugarea valorilor

{% hint style="info" %}
`.add()` - Inserarea unui element nou în set
{% endhint %}

`.add(value)`

```python
myset = {"a", "b", "c"} 
print(myset) 

myset.add("d") 
print(myset)

myset.add("a")
print(myset)
```

### Ștergerea elementelor

{% hint style="info" %}
`.remove()` - Șterge elemntul din set după valoare ( Dacă nu este in set va fi erroare)

`.discard()` - Șterge elemntul din set după valoare ( Dacă nu este in set erroare nu va fi)
{% endhint %}

`.remove(value)`

```python
boys = {"Ion", "Andrei", "Teofil"} 

boys.remove('Teofil')
boys.remove('Alexandru') # error

print(boys)
```

`.discard(value)`

```python
boys = {"Ion", "Andrei", "Teofil"} 

boys.remove('Teofil')
boys.remove('Alexandru') # NO Value NO Error

print(boys)
```

### Adaugarea elementelor din alt set

{% hint style="info" %}
`.update()` - Adaugă elemente din alt set sau din listă, dicționar ș.a.
{% endhint %}

`.update()` for sets

```python
fruits = {"apple", "banana", "cherry"}
tropical = {"pineapple", "mango", "papaya"}

fruits.update(tropical)

print(fruits)
```

`.update()` for iterables

```python
fruit_set = {"apple", "banana", "cherry"}
fruit_list = ["kiwi", "orange"]

fruit_set.update(fruit_list)

print(fruit_set)
```

### Unirea seturilor

Doua seturi pot fi unite folosind metoda `union()`. Setul obținut ca rezultat al acestei operații v-a fi un alt set care v-a conține toate elementele din primul set și toate elementele din al doilea set, *dar fara duplicate.*

```python
set_1 = {"Ion", "Andrei", "Teofil", "Ana"} 
set_2 = {"Ana", "Aurelia", "Maria", "Ion"} 

names = set_1.union(set_2) 

print(names) 
```

![](/files/-MkWX3_TQTofWYA7gkat)

### Intersecția seturilor

**Intersecția** a două seturi se face folosind metoda `intersection()`. Setul obținut ca rezultat al acestei operații v-a fi un alt set care v-a *conține elementele comune din ambele setur*i.

```python
set_1 = {1, 2, 3, 4, 5, 6}
set_2 = {5, 6, 7, 8, 9}

common = set_1.intersection(set_2)

print(common)
```

![](/files/-MkWXHJpYi868s6xUj6W)

### Diferența din seturi

&#x20;**Diferența** a două seturi se poate determina folosind metoda `difference()`. Ca rezultat, obținem un set care v-a conține *elementele care aparțin primului set și nu aparțin setului al doilea.*

```python
set_1 = {1, 2, 3, 4, 5, 6}
set_2 = {4, 5, 6, 7, 8, 9}

difference_1 = set_1.difference(set_2)
print(difference_1)

difference_2 = set_2.difference(set_1)
print(difference_2)
```

![](/files/-MkWXTlm5bM54PyKW7v6)

### Convertirea listei in set

`set(name_list)`

```python
names = ["Ion", "Andrei", "Teofil", "Ion"]
print(names)

unique_names = set(names)
print(unique_names)
```

Mai multe informații ([documentație](https://docs.python.org/2/library/sets.html), [more info](https://realpython.com/python-sets/))

> &#x20;Nostalgia is a [file ](/python/fisiere.md)that removes the rough edges from the good old days.&#x20;


---

# 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://wiki.girlsgoit.md/python/seturi.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.
