segunda-feira, 2 de janeiro de 2017

Mais uma estrutura: os conjuntos

Pois é, ainda há mais estruturas em Python para conhecer. Hoje vamos ver o que são os conjuntos e como usá-los. Estes são uma espécie de listas mas, ao contrário destas, não são ordenados (e, consequentemente, não são indexáveis) e não admitem elementos repetidos. Vamos ver como criá-los:
>>> a = set([4, 'batata', 5, 5.0])
>>> a
{'batata', 4, 5}
>>> b = set((5,6,7))
>>> b
{5, 6, 7}
Muito bem, como se percebe, podemos criar um conjunto com o comando set(), em que o argumento deve ser um iterável (pode ser uma lista, um tuplo, uma sequência criada por range()). Se quisermos criar um conjunto vazio, tem de se usar set(), e não {}, pois isto cria um dicionário vazio.
Antes de avançarmos, reparou que o conjunto a só tem um 5? Pois é, 5 e 5.0 são o mesmo número e os conjuntos não aceitam elementos repetidos... E repare que a ordem dos elementos se alterou. Não podemos aceder a elementos através de um índice, como nas listas, nos tuplos ou nos dicionários, pois os conjuntos não são ordenados. Também não podemos fazer slicing com conjuntos pelo mesmo motivo.
Mais uma curiosidade dos conjuntos:
>>> set('abracadabra')
{'r', 'c', 'a', 'b', 'd'}
O que se passou aqui? Antes de mais, quando se usa set() para criar um conjunto,  as cadeias de caracteres são divididas em caracteres individuais. Além disso, como os conjuntos não admitem elementos repetidos, apenas ficamos com as letras que constituem a palavra na cadeia de caracteres. Vamos agora ver operações com conjuntos:
>>> {2,3,5,6,7} | {2,6,7,8,9}
{2, 3, 5, 6, 7, 8, 9}
>>> {2,3,5,6,7} & {2,6,7,8,9}
{2, 6, 7}
>>> {2,3,5,6,7} - {2,6,7,8,9}
{3, 5}
>>> {2,3,5,6,7} ^ {2,6,7,8,9}
{3, 5, 8, 9}
Vejamos... A primeira operação (|), não é mais do que a união de conjuntos, em que o conjunto final é a junção dos elementos de cada conjunto, eliminando as repetições. A segunda (&) corresponde à interseção de conjuntos, em que apenas sobram os elementos que existiam em ambos os conjuntos iniciais. Depois temos a diferença de conjuntos (-), em que retiramos ao primeiro conjunto os elementos que constam no segundo. Finalmente, a última operação é a diferença simétrica (^), que corresponde à diferença entre união e a interseção dos conjuntos, ou por outras palavras, os elementos que apenas pertencem a cada um dos conjuntos mas não a ambos.
Bem, mas como se adicionam elementos a conjuntos? Uma resposta é usar a união de conjuntos:
>>> a = {5,7,8}
>>> a = a | {9}
>>> a
{8, 9, 5, 7}
E continuando o exemplo acima, também podemos retirar elementos a conjuntos usando a diferença:
>>> a = a - {5}
>>> a
{8, 9, 7}
Também podemos ver se um dado elemento pertence a um conjunto usando o operador in, e saber o número de elementos do conjunto usando len():
>>> 9 in a
True
>>> 6 in a
False
>>> len(a)
3
E, se o conjunto contiver apenas números, também podemos usar as funções max(), min() e sum():
>>> max(a)
9
>>> min(a)
7
>>> sum(a)
24
E agora, imagine que queria ver todos os elementos do conjunto um a um. Vamos ver um programa:
a = {1, 4, 5, 6, 3}
for i in a:
    print(i)
Quando executar este programa, vai obter o seguinte resultado:
1
3
4
5
6
Sim, podemos iterar os elementos de um conjunto usando um ciclo for. Já nem deve ser surpreendente, pois não?
Antes de acabarmos, existe um outro comando que cria conjuntos, o comando frozenset(). A diferença entre este e o set() é que no frozenset() os conjuntos criados já não se podem alterar. Mais tarde, quando falarmos em métodos e propriedades de objetos, isto fará mais sentido!
Ok, basta por hoje!

Sem comentários:

Enviar um comentário