29 de janeiro de 2016

Como percorrer duas listas de tamanhos diferentes

Temos a seguinte situação: preciso percorrer duas listas de tamanhos diferentes, mas com equivalência de posições. Como resolver?

Versão TL;DR: aumente a lista menor com extend(), antes de percorrê-las com zip().

Agora, a solução detalhada abaixo.

Exemplo:
>>> brinquedos = ["carrinho", "bola", "raquete"]
>>> cores = ["azul", "branca"]

O resultado precisa ser:
carrinho azul
bola branca
raquete **sem cor**

A solução em Python é bem simples, basta usar a função zip():
for (brinquedo, cor) in zip(brinquedos, cores):
    if not cor:
        cor = "**sem cor**"
    print ( "{b} {cor}".format(b=brinquedo, cor=cor) )

O problema é que a função zip() para no limite da menor lista. Isso faz com que a última posição não seja mostrada.

A listas têm um método extend(), que aumenta o tamanho dela. Ele vai resolver o problema antes de entrar no loop:
cores.extend( [None] * (len(brinquedos) - len(cores)) )
for (brinquedo, cor) in zip(brinquedos, cores):
    if not cor:
        cor = "**sem cor**"
    print ( "{b} {cor}".format(b=brinquedo, cor=cor) )

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

2 comentários:

  1. Oi Vinícius, se não for problema importar um módulo, itertools.zip_longest faz esse serviço de alongar a lista mais curta (python 3.2).

    Abraço!

    ResponderExcluir

Marcadores