Pular para o conteúdo

Como utilizar o método de achatamento em listas no Python?

CodeMDD.io

Como achatar uma lista de listas em Python

Introdução

Ao trabalhar com dados em Python, é comum ter os dados como uma lista de listas aninhadas. Uma operação frequente é achatar esses dados em uma lista unidimensional. Achatamento de uma lista envolve a conversão de uma lista multidimensional, como uma matriz, em uma lista unidimensional.

Vamos considerar um exemplo para ilustrar o que significa achatar uma lista. Suponha que você tenha a seguinte matriz de valores numéricos:

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]

A variável matrix contém uma lista em Python que contém quatro listas aninhadas. Cada lista aninhada representa uma linha na matriz. As linhas armazenam quatro itens ou números cada. Agora, vamos supor que você queira transformar essa matriz em uma lista unidimensional da seguinte forma:

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

Agora, vamos aprender três maneiras diferentes de achatarmos uma lista de listas em Python.

Usando um loop for para achatar uma lista de listas

A maneira mais simples de achatar uma lista de listas em Python é usando um loop for para iterar sobre as sublistas e adicionar cada elemento à nova lista achatada. Vamos ver como isso pode ser feito:

def achatar_com_for(matrix):
lista_achatada = []
for linha in matrix:
lista_achatada.extend(linha)
return lista_achatada

Nesta função, criamos uma nova lista vazia chamada lista_achatada, que será usada para armazenar os dados achatados quando extraídos da matrix. Em seguida, percorremos cada lista aninhada da matrix usando um loop for. A cada iteração, usamos o método .extend() para adicionar o conteúdo da sublista atual à lista_achatada. Este método recebe um objeto iterável como argumento e adiciona seus itens ao final da lista de destino.

Agora, vamos testar a função achatar_com_for() com a nossa matriz de exemplo:

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
resultado = achatar_com_for(matrix)
print(resultado)

A saída será:

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

Usando uma compreensão de lista para achatar uma lista de listas

Outra maneira elegante de achatar uma lista de listas em Python é usando uma compreensão de lista. A compreensão de lista é uma construção da linguagem Python que permite criar uma nova lista a partir de uma expressão e um loop for ou if.

Vamos ver como podemos usar uma compreensão de lista para achatar uma lista de listas:

def achatar_com_compreensao(matrix):
lista_achatada = [elemento for linha in matrix for elemento in linha]
return lista_achatada

Nesta função, usamos a sintaxe [elemento for linha in matrix for elemento in linha] para criar uma nova lista chamada lista_achatada. Essa compreensão de lista percorre cada linha na matrix e cada elemento em cada linha, adicionando o elemento à lista_achatada. O resultado é uma lista achatada.

Vamos testar a função achatar_com_compreensao() com a nossa matriz de exemplo:

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
resultado = achatar_com_compreensao(matrix)
print(resultado)

A saída será:

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

Usando ferramentas da biblioteca padrão para achatamento de listas

Python possui várias ferramentas úteis em sua biblioteca padrão que podem ser usadas para achatamento de listas. Vamos explorar duas dessas ferramentas: itertools.chain() e functools.reduce().

Achatando listas com itertools.chain()

O módulo itertools da biblioteca padrão de Python contém várias funções que lidam com iteradores, incluindo a função chain(). A função chain() permite combinar vários iteráveis em um único iterável.

Vamos ver como podemos usar itertools.chain() para achatarmos uma lista de listas:

import itertools
def achatar_com_itertools(matrix):
lista_achatada = list(itertools.chain(*matrix))
return lista_achatada

Nesta função, a lista de listas matrix é passada para itertools.chain(*matrix), onde o argumento *matrix desempacota a lista de listas em seus elementos constituintes. Em seguida, usamos list() para converter o iterável retornado por itertools.chain() em uma lista.

Vamos testar a função achatar_com_itertools() com a nossa matriz de exemplo:

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
resultado = achatar_com_itertools(matrix)
print(resultado)

A saída será a mesma:

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

Achatando listas com functools.reduce()

O módulo functools da biblioteca padrão de Python contém a função reduce(), que permite reduzir uma sequência de elementos a um único valor aplicando uma função de dois argumentos cumulativa a partir da esquerda para a direita.

Vamos ver como podemos usar functools.reduce() para achatarmos uma lista de listas:

import functools
def achatar_com_reduce(matrix):
lista_achatada = functools.reduce(lambda a, b: a + b, matrix)
return lista_achatada

Nesta função, usamos functools.reduce() com uma função lambda que recebe dois argumentos a e b e retorna a concatenação dos dois. Em outras palavras, a função lambda concatena duas sublistas em uma única lista. functools.reduce() então aplica essa função cumulativamente a todas as sublistas da matrix, resultando na lista achatada.

Vamos testar a função achatar_com_reduce() com a nossa matriz de exemplo:

matrix = [
[9, 3, 8, 3],
[4, 5, 2, 8],
[6, 4, 3, 1],
[1, 0, 4, 5],
]
resultado = achatar_com_reduce(matrix)
print(resultado)

A saída será a mesma:

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

Conclusão

Neste tutorial, você aprendeu três maneiras diferentes de achatar uma lista de listas em Python. Usando um loop for, uma compreensão de lista ou ferramentas da biblioteca padrão, você pode facilmente transformar uma lista aninhada em uma lista unidimensional. O achatamento de listas é uma operação útil ao manipular dados em Python, especialmente em ciência de dados e análise.