NOME DURAÇÃO
Curso de Python
Primeira Aula de Python
Características do Python
Recursos do Python
IDLE - Modo Interativo do Python
Instalando o PyCharm no Windows
Primeiro programa em Python
Comentários em Python
Indentação do código Python
Variáveis em Python
Características das Variáveis em Python
Nomenclatura das Variáveis em Python
Tipos de dados em Python
Variáveis do tipo Ponto Flutuante do Python
Entrada de Dados em Python
Operadores Aritméticos do Python
Módulo da Divisão em Python
Potenciação e Radiciação em Python
Operadores Relacionais do Python
Tomada de Decisão em Python
Estrutura if e else em Python
Depurando código Python
Operadores Relacionais Compostos do Python
Operadores Relacionais na Prática em Python
Operadores Lógicos em Python
Blocos de Instrução em Python
Blocos de Instrução em Python (Parte II)
Blocos de Instrução Python na Prática
Escopo de Nomes em Python
Estrutura de Atribuição Simples do Python
Atribuição Múltipla em Python
Operadores de Atribuição Compostos do Python
Atribuição Condicional em Python
Iteração em Python
Laços de Repetição do Python
Estrutura de repetição while em Python
A instrução for em Python
A função range() do Python
O for loop e a função range() do Python
Instrução break do Python
Instrução continue em Python
Estruturas de Dados Lista em Python
Lista, Pilha, Array, Set em Python
A classe list do Python
Classe list - Conceitos Avançados do Python
Funções da Classe list do Python
Iteração de Listas em Python
Fatiando Listas em Python
Incluindo, Alterando e Excluindo Elementos no Python
Ordenamento de Listas em Python
Quantidade de Itens em Python
Tuplas em Python
Operadores in e not in do Python
Operadores and, or e in do Python
Exemplo com Operador in em Python
Introdução às Strings em Python
Fatiando Strings com Python
Funções das Strings no Python
Comparação de Strings em Python
Iterando Strings em Python
Introdução aos Dicionários do Python
Dicionários na Prática com Python
Funções dos Dicionários no Python
Introdução às Funções em Python
Parâmetros de Função em Python
Parâmetros default em Python
Argumento de Função Nomeado vs Posicional em Python
Retornando Valores pelas Funções em Python

Nesta aula iniciaremos o estudo dos dicionários a estrutura que talvez a mais importante da linguagem e a mais utilizada durante o desenvolvimento. Também aprenderemos as principais funções da estrutura de dados "dic" e faremos vários exemplos para conseguirmos entender o funcionamento e carecterísticas das funções.

FUNÇÕES DA ESTRUTURA dic

len(x) - semelhante a forma como utilizamos em outras estruturas, para nós conhecermos a quantidade de elementos contidos numa lista, basta nós utilizarmos a função len() e passarmos como parâmetro a lista que desejarmos conhecer o tamanho.

>>> x = {1:"aaa", 2:"bbb", 3:"ccc"}
>>> len(x)
3

del(x) - Um elemento pode ser removido de uma lista utilizando a função del() e enviando como parâmetro, qual elemento da lista nós desejamos que seja removido.

x = { 1:"aaa", 2:"bbb", 3:"ccc" }
del(x[1])
print(x)
{1:"aaa", 3:"ccc"}

OPERADORES in e not in

Quando precisarmos saber se uma letras está contida em um conjunto, podemos utilizar o operador "in", que numa tradução, significa: "em", "dentro de", "está em" ou "está contido em".

Da mesma forma, nós podemos verificar se um elemento não está contido, utilizando a negação do operador in, que é: "not in": "não está dentro", "não pertence ao conjunto de".

>>> 'a' in 'abcdefghij'
True
>>> 'ac' in 'abcdefghij'
False

No primeiro exemplo, nós estamos verificando se o caractere "a", está contido em um grupo de caracteres. No caso, a letra "a", está contida naquela lista. Já, no segundo exemplo, nós estamos verificando se o conjunto "ac" está contido no conjunto 'abcdefghij', e a resposta foi False, e por quê? Nós temos que os elementos "a" e "c" estão contidos, porém, não estão contidos em sua forma agrupada. Assim, elementos composto só serão iguais ou estarão contidos se os elementos e a ordem destes forem exatamente as mesmas.

RETORNANDO ELEMENTOS ALEATÓRIOS

No exemplo anterior, nós estudamos uma situação onde havia uma lista de contatos que deveriam ser retornados. Numa situação real, o nosso usuário talvez não se importe a ordem para retornar as ligações. Assim, nós podemos utilizar um função semelhante ao pop(), porém, esta não recebe parâmetro e o valor retornado será qualquer um, em qualquer ordem. Em um primeiro momento pode parecer não haver lógica essa função, mas na prática, é muito comum nós termos uma lista de tarefas e iremos resolver sem se importar com a ordem. Nessas situações, utilizar a função popitem() evita o trabalho de utilizar um looping e ao acessarmos um elemento, este será removido imediatamente.

retornar_ligacao = {
    "Perícles": 30301122,
    "Menelau": 33547877,
    "Atreu": 33381245,
    "Tiestes": 36458899
}

>>> retornar_ligacao.popitem()
('Menelau', 33547877)

>>> retornar_ligacao.popitem()
('Perícles', 30301122)

>>> retornar_ligacao.popitem()
('Atreu', 33381245)

>>> retornar_ligacao.popitem()
('Pessoa xyz', -5254)

>>> retornar_ligacao.popitem()
Traceback (most recent call last):
  File "<pyshell#166>", line 1, in <module>
    retornar_ligacao.popitem()
KeyError: 'popitem(): dictionary is empty'
>>>

ACESSO A CHAVES INEXISTENTES

É comum nós tentarmos acessar um elemento de um dicionário que já tenha sido removido ou então, um elemento que achávamos que estaria contido. Nessas situações, será levantado uma exceção nos informando que estamos tentando fazer acesso a uma chave que não existe.

>>> a = {"aaa":111, "bbb":222, "ccc":333}
>>> a["zzz"]
error

A forma mais simples para evitarmos essas situações é utilizando os operadores "in" e "not in".

>>> a = {"aaa":111, "bbb":222, "ccc":333}
>>> if a["zzz"]
        print(a["zzz"])

Atribuindo elementos com o mesmo valor a um outro dicionário

Nos momento em que precisarmos atribuir todos os elemento de um dicionário para outro, nós não podemos simplesmente atribuir o dicionário x e dizer que este receber y. Nessa situação, somente a referência seria copiada e não os elementos propriamente. Logo, no momento em que fizéssemos acesso a um elemento e alterássemos o seu valor, esta alteração estaria visível em ambas as variáveis, até porque, ambas apontam para uma mesma estrutura. Logo, se desejarmos duplicar os elementos e não somente atribuir a referência, temos a nossa disposição uma função específica.

>>> a = {10:"Máximo", 5:"Meio", 1:"Mínimo"}
>>> a
{1: 'Mínimo', 10: 'Máximo', 5: 'Meio'}
>>> a[10]
'Máximo'
>>> a[5]
'Meio'
>>> b = a
>>> b
{1: 'Mínimo', 10: 'Máximo', 5: 'Meio'}
>>> a[1] = "xxxx"
>>> a
{1: 'xxxx', 10: 'Máximo', 5: 'Meio'}
>>> b
{1: 'xxxx', 10: 'Máximo', 5: 'Meio'}
>>> c = a.copy()
>>> c
{1: 'xxxx', 10: 'Máximo', 5: 'Meio'}
>>> a[1] = "yyyy"
>>> a
{1: 'yyyy', 10: 'Máximo', 5: 'Meio'}
>>> b
{1: 'yyyy', 10: 'Máximo', 5: 'Meio'}
>>> c
{1: 'xxxx', 10: 'Máximo', 5: 'Meio'}
>>>

MESCLANDO ITENS DE 2 DICIONÁRIOS

É comum na manipulação de dicionários a necessidade de unir um conjunto de elementos a um outro conjunto. Isso seria a intersecção de conjuntos, ou seja, os elementos de b são copiado para o elemento a. Para isso, nós temos um método de nome update(). A seguir, temos um exemplo onde os elementos do conjunto "b" são copiados para o conjunto "a".

>>> a = {"aaa":10, "bbb":20, "ccc":30}
>>> b = {"ddd":40, "eee":50, "ddd":60}
>>> a.update(b)
>>> print(a)
{"aaa":10, "bbb":20, "ccc":30, "ddd":40, "eee":50, "ddd":60}

Vale observar que os elementos de um conjunto não são adicionados a outro conjunto, o que acorre é somente um copia. Logo, as alterações feitas nos elementos conjunto alvo não serão refletidas no conjunto receptor.

ITERANDO DICIONÁRIOS

Basicamente, um dicionário pode ser iterado seguindo a estrutura já estudada. O que o diferencia é que ao invés de um valor ser atribuído a uma única variável a cada ciclo, nós agora poderemos fazer uso de duas variáveis e assim, para a primeira será atribuído a chave e para segunda variável será atribuído o valor.

Nos exemplos a seguir,, estudaremos cada situação:

>>> dicionario = {"aaa":10, "bbb":20, "ccc":30}
>>> for e in dicionario:
    print(e)
aaa
ccc
bbb

Neste exemplo nós imprimimos todas as chaves do nosso dicionário, porém, como imprimir os valores?

>>> for e in dicionario.values():
        print(e)

10
30
20

Quando nós desejarmos iterar e objeter a cada ciclo a lista de chaves, nós podemos utilizar a variável que contém a referência para o dicionário. Agora, se nós desejarmos que o valor seja atribuído a cada ciclo para a variável, nós temos que iterar utilizando a função de nome values() que retorna um objeto do tipo iterator.

E caso seja necessário retornar cada elemento contendo a chave e o valor? Neste caso, utilizamos um looping for e mandamos imprimir ambos os valores, como podemos ver abaixo:

>>> for i in dicionario:
>>>     i, dicionario[e]
('aaa', 10)
('ccc', 30)
('bbb', 20)

Assim, nós temos que é impresso uma tupla, onde o primeiro elemento é a chave e o segundo o respectivo valor. O valor foi impresso utilizando a variável que contém a referência ao dicionário e passando a chave do elemento que desejamos que seja retornado.

CONVERTENDO DICIONÁRIO EM LISTA

As vezes torna-se necessário a conversão entre estruturas diferente, como exemplo, converter um dicionário em uma lista. Internamente, o Python manipula um dicionário de maneira muito parecida a uma lista. De fato, um dicionário, como nós já estudamos, é uma lista, porém uma lista especializada.

Há 3 funções para extrair uma lista de um dicionário. A primeira função é keys(). Como o nome da função sugere, este método ira retornar a lista de chaves contidas no nosso dicionário. Da mesma forma, nós temos a função values() que retorna a lista de valores. Ambos os métodos extraem no formato de lista uma das 2 informações contidas em todos os dicionário, ou seja, uma lista contendo as chaves e outra contendo os valores.

A terceira maneira de lista que podemos extrair é uma lista de tuplas. Assim, o valor retornado será uma lista contendo tuplas, onde cada tupla será composta pela chave e pelo valor mapeado respectivamente. Essa é uma maneira bastante eficaz para que possamos rapidamente extrair todas as informações contidas na estrutura dicionário. A seguir, temos uma tabela que contém as funções que extraem as informações de um dicionário.

Funções que retornam listas de dicionários

dict.keys()

Retorna a lista de chaves contidas em um dicionário.

dict.values()

Retorna a lista de valores contidos em um dicionário.

dict.items()

Retorna uma lista de tuplas, onde cada tupla é composta por dois valores: a chave e o valor mapeado respectivamente.

Exemplos:

>>> dicionario = {"aaa":10, "bbb":20, "ccc":30}
>>> dicionario.keys()
dict_keys(['aaa', 'bbb', 'ccc'])
>>> dicionario.items()
dict_items([('aaa', 10), ('bbb', 20), ('ccc', 30)])
>>> dicionario.values()
dict_values([10, 20, 30])

Uma outra forma de obter a lista de chaves de um dicionário é através da coerção de tipos. Assim, se dissermos explicitamente para que o interpretador retorne um lista de um dicionário, o mesmo irá retornar a lista de chaves.

>>> list(dicionario)
['aaa', 'bbb', 'ccc']

CONVERSÃO - LISTA PARA DICIONÁRIO

Existe várias formas para que listas sejam convertidas em dicionários, no entanto, não podemos esquecer que um dicionário é um elemento que contém chave-valor. Não podemos converter uma única lista em um dicionário sem chaves, até seria possível o oposto, porém, não há muita razão para este tipo de abordagem.

É mais comum convertermos duas listas que contém a mesma quantidade de elementos em um dicionário. Assim, se nós tivermos em uma lista um conjunto de elementos que representem as chaves e noutra um conjunto de elementos que representem os valores, nós podemos converter essas listas em dicionário.

A função built-in zip do Python retorna uma lista contendo tuplas, onde o primeiro valor é o da primeira lista, e o segundo valor da tupla, corresponde a segunda lista. Assim, com a função zip e a coerção de tipos, conseguimos obter um dicionário através de duas listas. A seguir, nós criamos 2 listas e em seguida, convertemos as listas em uma lista de tuplas e depois, convertemos as listas em um dicionário.

>>> d1 = ['aaa','bbb','ccc']
>>> d2 = ['1','2','3']
>>> list(zip(d1, d2))
[('aaa', '1'), ('bbb', '2'), ('ccc', '3')]
>>> dict(zip(d1, d2))
{'aaa': '1', 'bbb': '2', 'ccc': '3'}

A função zip faz parte da programação funcional implementada pelo Python. Assim, essa é uma das ferramentas que foram implementadas na linguagem e que trabalham muito bem com o paradigma de orientação a objetos.

ITERANDO DICIONÁRIOS

ITERAÇÃO SIMPLES

Iterar um dicionário é um pouco diferente do que iterar uma lista ou então uma tupla. Isso porque, em um dicionário, temos que os elementos são compostos por 2 valores: a chave e o valor.

Assim, temos que decidir de qual maneira queremos atravessar a lista e também, quais os valores que desejamos que sejam retornado a cada iteração.

Para que possamos estudar a iteração, vamos definir um dicionário onde cada número de telefone está relacionado ao nome de uma pessoa.

tel = {
    30301122: "Perícles",
    33547877: "Menelau",
    33381245: "Atreu",
    36458899: "Tiestes"
}

Agora que temos um dicionário, vamos itera-lo inicialmente, de maneira como se tivéssemos uma lista.

for i in tel:
    print(i)

Perícles
Tiestes
Menelau
Atreu

Como visto, iterar um dicionário da maneira mais simples e intuitiva faz com que a cada ciclo a variável definido na estrutura for receba uma chave que está associada a um valor.

A razão pela qual foi atribuido a chave para a variável definida na estrutura for é para que possamos facilmente obter o respectivo valor. No código a seguir, ao invés de imprimirmos a chave, nós a utilizamos para obter o valor relacionado:

for i in tel:
    print(tel[i])

Então, essa é a maneira mais simples de iterarmos qualquer dicionários, porém, o Python fornece alguns mecânismos mais sofisticados.

UTILIZANDO FERRAMENTAS DE ITERAÇÃO

Agora, vamos modificar a forma como estamos iterando para que possamos obter a cada ciclo a chave e o seu valor de maneira mais simples e prática.

Inicialmente, vamos iterar a estrutura que nos é retoranda pela função items() dos dicionários. Com esta, somos capazes de declararmos 2 variáveis e atribuímos a cada uma a respectiva chave e o seu valor, por exemplo:

for k,v in tel.items():
    print(k, " - ", v)

No código acima, declaramos 2 variáveis dentro da estrutura for, no caso, as variáveis k e v, a letra k vem de key e a letra v de value. Assim, temos que tanto a chave como também o valor são atribuido as variáveis a cada ciclo e então, podemos utiliza-las de maneira muito mais simples e prática.

É importante observar que estamos invocando a função items() definida dentro da classe dict. Do contrário, não seria possível iterarmos e também, o Python acusaria um erro quando tentassemos executar o código.



Tags curso, python

Comentários

comments powered by Disqus