segunda-feira, 18 de janeiro de 2010

Dicionários

Existem muitos modos de construir dicionários. Podemos, por exemplo, começar com um dicionário vazio e depois ir acrescentando pares (chave : valor), ou podemos indicar explicitamente os pares na inicialização. Neste último caso as sintaxes possíveis são variadas, e aconselhamos o leitor a ver isso mesmo no manual da linguagem. O que queremos ilustrar aqui é outra possibilidade: temos uma lista que contém alternadamente as chaves e os valores correspondentes e pretendemos, a partir dessa lista, construir o correspondente dicionário. Estamos a admitir que não existem chaves repetidas na lista.

A solução trivial será:

def dicio_lista(lista_chaves_valores):
"""Constrói um dicionário a partir de uma lista com chaves e valores
alternados."""
dicio ={}
for i in range(len(lista_chaves_valores)/2):
dicio[lista_chaves_valores[2*i]] = lista_chaves_valores[2*i + 1]
return dicio

Mas podemos fazer melhor usando o método zip e o construtor para dicionários dict:

def dicio_lista_b(lista_chaves_valores):
"""Constrói um dicionário a partir de uma lista com chaves e valores
alternados."""
return dict(zip(lista_chaves_valores[::2], lista_chaves_valores[1::2]))

Nas duas soluções tivemos que lidar com a separação dos elementos em chaves e valores. As chaves estão nas posições pares e os valores nas posições ímpares da lista. Claramente preferimos a segunda!

6 comentários:

  1. professor eu percebi o objectivo do exercício, mas utilizaria, talvez por hábito, a primeira opção. Tenho mesmo com o exercicio exposto um certa dificuldade em compreender o comando zip, pois associava-o a uma matriz/lista e não a um dicionário. pelo que vejo utilizamos o zip(chave,valor) para formar o dicionário. Estou correcta?

    Obrigado.

    ResponderEliminar
  2. O comando zip recebe como argumentos várias sequências e devolve uma lista de tuplos:

    >>> s1 = (1,2,3)
    >>> l2 = ['a','b','c']
    >>> c3 = 'xyz'
    >>> zip(s1,l2,c3)
    [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z')]
    >>>

    Não está por isso "agarrado" a dicionários. Mas pode ser usado para construir dicionários. Mas é o construtor dict que fabrica o dicionário. Há muitas maneiras de construir um dicionário:

    >>> d1 = {'a':1,'b': 2}
    >>> d2 = dict(a=1,b=2)
    >>> d1
    {'a': 1, 'b': 2}
    >>> d2
    {'a': 1, 'b': 2}
    >>> ## método usado no exemplo!
    >>> lt = zip(l2,s1)
    >>> lt
    [('a', 1), ('b', 2), ('c', 3)]
    >>> d3 = dict(lt)
    >>> d3
    {'a': 1, 'c': 3, 'b': 2}
    >>>

    ResponderEliminar
  3. estou agora a visitar o teu blog, que achei muito interessante - por falar em Python e iniciantes, aproveito para falar de programas como Shoebot e Nodebox, que pode encorajar imenso curiosos sobre a linguagem Python em experimentá-la mais a fundo, na diversão de se desenhar linhas e círculos, mais ou menos como o Proce55ing em relação ao Java.

    ResponderEliminar
  4. É bom ter visitantes mesmo quando o blogue hibernou... É um blogue de apoio a uma disciplina do curso de Engenharia Informática da Universidade de Coimbra. Será reactivado em Setembro.Também tem alunos do curso de Design e Multimédia pelo que o recurso a algo semelhante a Processing era bem vindo. Conheço o Nodebox mas não é cross-platform. O Shoebot não conhecia. Vou explorar.

    ResponderEliminar
  5. Sou aluna do curso de Ciência da Computação. Sinto muita dificuldade em programação em python, pois consigo assimilar toda parte teórica, mas quando chega a hora de criar os programas me perco e não consigo criar. Assim sendo gostaria que se possível vc me desse uma dica do que fazer para melhorar. Obrigada

    ResponderEliminar
    Respostas
    1. É difícil dar comentários gerais que não sejam banalidades abstractas. Pense num problema concreto que quer resolver, tente construir a solução em Python e envie para eu comentar. Pode tentar através do meu email: ernesto@dei.uc.pt.

      Eliminar