Achatar Listas em Python: 3 Métodos Simples e Eficientes

Transformar uma matriz bidimensional (2D) em uma matriz unidimensional (1D), um processo conhecido como “achatamento”, pode ser realizado de diversas maneiras. Neste guia, vamos explorar algumas dessas abordagens.

Para ilustrar, observe o seguinte exemplo:

Entrada:

[[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]

Resultado:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#1. Abordagem com Loops

A forma mais comum de realizar o achatamento de uma matriz 2D é utilizando loops. Acredito que a maioria já esteja familiarizada com essa técnica. Vamos detalhar os passos para resolver o problema com loops:

  • Começamos com uma lista de listas preenchida com dados de exemplo, que chamaremos de “dados”.
  • Em seguida, inicializamos uma lista vazia, que será denominada “lista_achatada”.
  • Percorremos cada sublista em “dados” com um loop.
    • Extraímos todos os elementos da sublista atual.
    • Adicionamos esses elementos à “lista_achatada” usando o método `append`.
  • Por fim, exibimos a “lista_achatada” resultante.

Abaixo está o código correspondente:

# Inicializando os dados e uma lista vazia
dados = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]
lista_achatada = []

# Iterando sobre os dados
for item in dados:
    # Adicionando os elementos à lista_achatada
    lista_achatada += item

# Exibindo a lista_achatada resultante
print(lista_achatada)

Em vez de usar o operador de concatenação (`+=`), poderíamos usar um loop interno para adicionar cada elemento das sublistas. Além disso, as compreensões de lista são uma alternativa elegante aos loops tradicionais.

Ambas as abordagens atingem o mesmo objetivo. Vamos explorar um outro método para resolver o problema.

#2. Utilizando `itertools.chain`

Vamos utilizar o método `chain` do módulo `itertools`, uma ferramenta integrada do Python.

O método `chain` percorre cada sublista, retornando seus elementos sequencialmente até que todas as sublistas sejam processadas. Ele gera um iterável, que precisa ser convertido em uma lista para uso posterior.

Confira os passos para solucionar o problema:

  • Inicializamos a lista de listas com dados de exemplo, que chamaremos de “dados”.
  • Obtemos o iterável achatado utilizando `itertools.chain(*dados)`.
  • Convertemos o iterável resultante em uma lista.
  • Imprimimos a lista achatada.

O código correspondente pode ser visualizado abaixo:

# Importando o módulo
import itertools

# Inicializando os dados
dados = [[1, 2, 3], [4, 5], [6, 7, 8, 9, 10]]

# Achatando a lista e armazenando o resultado
lista_achatada = itertools.chain(*dados)

# Convertendo o iterável para uma lista e imprimindo
print(list(lista_achatada))

#3. Achatamento de Listas Aninhadas em Múltiplos Níveis

Até agora, focamos em listas de listas com apenas um nível de aninhamento. No entanto, os métodos anteriores não funcionam para listas com vários níveis de aninhamento. Veja o exemplo abaixo:

Entrada:

[1, [2, 3, [4, 5]], 6, [[7], [8, 9]]]

Resultado:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Como não conhecemos a profundidade das listas antes da execução do programa, a recursão é a ferramenta adequada para resolver este problema.

  • Inicializamos os dados de acordo com o exemplo e atribuímos o nome “dados”.
  • Inicializamos uma lista vazia que chamaremos de “lista_achatada”.
  • Criamos uma função chamada `acha_lista` que faz o seguinte:
    • Percorremos cada elemento da lista fornecida.
    • Se o elemento for uma lista, chamamos a função `acha_lista` recursivamente com este elemento como novo argumento.
    • Se o elemento não for uma lista, adicionamos o elemento à “lista_achatada”.
  • Invocamos a função com os “dados” como argumento.
  • A função preencherá a “lista_achatada” com todos os elementos encontrados.
  • Imprimimos a “lista_achatada” para verificar a saída.

Parece bastante complexo, mas a tradução das etapas acima em código é mais simples do que parece:

# Inicializando os dados e uma lista vazia
dados = [1, [2, 3, [4, 5]], 6, [[7], [8, 9]]]
lista_achatada = []

# Função
def acha_lista(dados):
    # Iterando sobre os dados
    for elemento in dados:
        # Verificando se o elemento é uma lista
        if type(elemento) == list:
            # Chamando a mesma função recursivamente
            acha_lista(elemento)
        else:
            lista_achatada.append(elemento)

# Achatando a lista
acha_lista(dados)

# Exibindo a lista_achatada
print(lista_achatada)

É importante lembrar que não modificamos a lista original; em vez disso, criamos uma nova lista com os elementos da lista fornecida.

Conclusão

Espero que este guia tenha sido útil. Existem muitas outras maneiras de achatar listas em Python, mas as abordagens apresentadas aqui são algumas das mais fáceis e diretas.

Tenha uma ótima experiência de programação! 🙂