Outra dúvida recorrente quando se lida com a iteração é iterar sobre duas listas.

Como vimos no post anterior (Ciclos em Python, problemas comuns e os índices) não precisamos de iterar sobre inteiros para indexar os valores numa iteração. Outro desafio numa iteração é como percorrer simultaneamente duas listas.

cidades =['Aveiro', 'Braga', 'Porto', 'Lisboa']
habitantes = [55291, 181894, 237584, 547631]
for i in range(len(cidades)):
    cidade = cidades[i]
    populacao = habitantes[i]
    print ("{0} tem {1} habitantes".format(cidade, populacao))

Aveiro tem 55291 habitantes
Braga tem 181894 habitantes
Porto tem 237584 habitantes
Lisboa tem 547631 habitantes


A geração de inteiros para percorrer os valores das listas pelos seus índices é uma forma de o fazer, mas mais uma vez não existe necessidade de gerar inteiros para executar esta tarefa.

for cidade, populacao in zip(cidades, habitantes):
    print ("{0} tem {1} habitantes".format(cidade, populacao))

Aveiro tem 55291 habitantes
Braga tem 181894 habitantes
Porto tem 237584 habitantes
Lisboa tem 547631 habitantes

A função zip() recebe dois iteréveis e junta-os num só, devolvendo um iterável de pares. Como se pode ver no exemplo acima, conseguimos obter o mesmo resultado que a versão que se socorre de inteiros.
De reparar que como não usa indexação, a função zip() funciona com qualquer iterável e não apenas com listas.

A função dict() recebe como argumento um stream de pares do tipo chave/valor e constrói um dicionário a partir deles. Se tivermos duas listas uma com as chaves, por exemplo com nomes de cidades e outra com os valores, por exemplo com o número de habitantes a função zip(cidades, habitantes) produzirá um stream de pares que poderá ser usado pela função dict dict(zip(cidades, habitantes)) para produzir um dicionário.

cidades =['Aveiro', 'Braga', 'Porto', 'Lisboa']
habitantes = [55291, 181894, 237584, 547631]
populacoes_por_cidade = dict(zip(cidades, habitantes))

print populacoes_por_cidade
{'Lisboa': 547631, 'Braga': 181894, 'Aveiro': 55291, 'Porto': 237584}

print max(populacoes_por_cidade.values())
547631

print max(populacoes_por_cidade.items(), key=lambda b: b[1])
('Lisboa', 547631)

print max(populacoes_por_cidade, key=populacoes_por_cidade.get)
Lisboa


Supondo que temos um dicionário com cidades e o seu número de habitantes.

Podemos utilizar a função max() para obter a maior população, o nome e a população da cidade com mais habitantes, ou apenas o nome da cidade mais populosa.

Na linguagem de programação Python, a iteração permite-nos obter informação útil através de uma única e concisa expressão.



Os ciclos continuarão a ser o assunto principal dos próximos posts.


Este post faz parte da série de posts sobre Ciclos e Interáveis em Python:
  1. Ciclos em Python, o básico
  2. Ciclos em Python e os Iteráveis
  3. Ciclos em Python, mais exemplos de Iteráveis
  4. Ciclos em Python, uso de Iteráveis fora dos ciclos
  5. Ciclos em Python, problemas comuns e os índices
  6. Ciclos em Python, iterar sobre duas listas (post actual)
  7. Ciclos em Python, iteração personalizada
  8. Ciclos em Python, Generators - parte 1
  9. Ciclos em Python, Generators - parte 2
  10. Ciclos em Python, Generators - parte 3
  11. Ciclos em Python, operações de baixo nível
  12. Ciclos em Python, como tornar os nossos objectos em Iteráveis
  13. Ciclos em Python, conclusão


A inspiração para este post veio daqui.