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! 🙂