Pular para o conteúdo

Como usar a função flatten no Python?

CodeMDD.io

Como Achatar uma Lista de Listas em Python

Às vezes, ao trabalhar com dados, você pode ter os dados como uma lista de listas aninhadas. Uma operação comum é achatar esses dados em uma lista unidimensional em Python. Achatando uma lista envolve converter uma lista multidimensional, como uma matriz, em uma lista unidimensional.

Para ilustrar melhor o que significa achatar uma lista, digamos que você tenha a seguinte matriz de valores numéricos:

Python

>>> 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 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, digamos que você queira transformar essa matriz na seguinte lista:

Python

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

Como você consegue achatar sua matriz e obter uma lista unidimensional como a acima? Neste tutorial, você aprenderá como fazer isso em Python.

Como Achatar uma Lista de Listas com um Loop for

Como você pode achatar uma lista de listas em Python? Em geral, para achatar uma lista de listas, você pode executar as seguintes etapas de maneira explícita ou implícita:

  1. Criar uma nova lista vazia para armazenar os dados achatarados.
  2. Iterar sobre cada lista aninhada ou sublista na lista original.
  3. Adicionar cada item da sublista atual à lista de dados achatarados.
  4. Retornar a lista resultante com os dados achatarados.

Para continuar com o exemplo da matrix, aqui está como você pode traduzir essas etapas em código Python usando um loop for e o método .extend():

Python

def achatar_extend(matrix):
flat_list = []
for linha in matrix:
flat_list.extend(linha)
return flat_list

Dentro de achatar_extend(), você primeiro cria uma nova lista vazia chamada flat_list. Você usará essa lista para armazenar os dados achatados quando extraí-los de matrix. Em seguida, você inicia um loop para iterar sobre as listas internas ou aninhadas de matrix. Neste exemplo, você usa o nome linha para representar a lista aninhada atual.

Agora, execute o código a seguir para verificar se sua função faz o trabalho:

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

Você verá a lista achatada como saída:

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

Essa abordagem usando um loop for e .extend() é uma maneira simples e eficiente de achatar uma lista de listas em Python. No entanto, existem outras técnicas que você pode usar para realizar a mesma tarefa.

Usando uma Compreensão para Achatar uma Lista de Listas

Uma alternativa elegante e concisa para achatar uma lista de listas é usar uma compreensão de lista. Uma compreensão de lista é uma maneira concisa de criar uma nova lista aplicando uma expressão a cada elemento de um iterável ou a cada par de elementos de dois iteráveis.

Para achatar uma lista de listas com uma compreensão de lista, você pode simplesmente usar duas instruções for aninhadas e uma expressão que retorna cada item das sublistas. Aqui está como você pode fazer isso:

Python

def achatar_compreensao(matrix):
return [item for linha in matrix for item in linha]

Desta vez, você não precisa criar uma lista vazia para armazenar os dados achatados. A compreensão da lista já lida com isso para você. Você simplesmente retorna a expressão [item for linha in matrix for item in linha], que itera sobre cada linha em matrix e sobre cada item em linha, retornando cada item para criar a lista achatada.

Você pode testar a função da mesma maneira que antes:

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

A lista achatada será a mesma:

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

Essa abordagem com compreensão de lista é uma maneira elegante de achatar uma lista de listas. Além disso, em muitos casos, pode ser mais rápida do que usar um loop for com o método .extend().

Achatar uma Lista Usando Ferramentas da Biblioteca Padrão e Integradas

A biblioteca padrão do Python e algumas das ferramentas integradas fornecem funções e métodos úteis para achatamento de listas. Nesta seção, você aprenderá três dessas ferramentas:

  • Encadeando iteráveis com itertools.chain()
  • Concatenando listas com functools.reduce()
  • Usando sum() para concatenar listas

Essas soluções podem não ser tão intuitivas quanto um loop for ou uma compreensão de lista, mas ainda são poderosas e eficazes. Vamos explorar cada uma delas.

Encadeando Iteráveis com itertools.chain()

O módulo itertools da biblioteca padrão do Python fornece a função chain(), que é útil quando você deseja concatenar vários iteráveis em uma sequência única. Neste caso, você pode usar chain() para achatar uma lista de listas.

Aqui está como você pode usar chain() para achatar uma lista de listas:

Python

import itertools
def achatar_chain(matrix):
return list(itertools.chain(*matrix))

Dentro de achatar_chain(), você cria uma lista achatada usando list(itertools.chain(*matrix)). O * antes de matrix desempacota as sublistas de matrix em argumentos separados para chain().

Vamos testar a função:

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

Você obterá a mesma lista achatada:

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

Usar itertools.chain() é uma ótima opção quando você precisa achatar uma lista de listas de maneira concisa e eficiente.

Concatenando Listas com functools.reduce()

O módulo functools da biblioteca padrão do Python inclui a função reduce(), que permite aplicar uma função a uma sequência de elementos até obter um único valor. Essa função é útil quando você deseja concatenar listas em uma única lista.

Veja como você pode usar reduce() para achatamento de listas:

Python

import functools
def achatar_reduce(matrix):
return functools.reduce(lambda x, y: x + y, matrix)

Dentro de achatar_reduce(), você usa functools.reduce() com uma função lambda que concatena duas listas, x e y, em uma única lista. Essa função lambda é aplicada sucessivamente a todas as sublistas em matrix, até que todas sejam concatenadas em uma única lista.

Vamos testar a função:

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

O resultado será a mesma lista achatada:

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

functools.reduce() pode ser uma opção útil quando você precisa concatenar listas de maneira simples e elegante.

Usando sum() para Concatenar Listas

A função sum() do Python é útil para somar elementos de uma sequência, mas também pode ser usada para concatenar listas quando você fornecer uma lista como argumento inicial.

Aqui está como você pode usar sum() para achatamento de listas:

Python

def achatar_sum(matrix):
return sum(matrix, [])

Dentro de achatar_sum(), você usa sum(matrix, []). O segundo argumento, [], é uma lista vazia que atua como a lista inicial para concatenar as sublistas. A função sum() concatena as sublistas em uma única lista.

Vamos testar a função:

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

Você obterá a mesma lista achatada:

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

Usar sum() dessa maneira é uma opção interessante quando você deseja uma solução concisa e direta para achatar uma lista de listas.

Considerando o Desempenho ao Achatar suas Listas

Ao achatar uma lista de listas em Python, é importante considerar o desempenho de diferentes abordagens, especialmente para grandes conjuntos de dados.

Usar um loop for com .extend() ou uma compreensão de lista é geralmente a maneira mais rápida de achatamento, especialmente para listas pequenas ou de tamanho moderado.

No entanto, para conjuntos de dados maiores, onde o desempenho é crítico, você pode considerar o uso de ferramentas da biblioteca NumPy. NumPy é uma biblioteca popular para computação científica em Python e oferece suporte a várias operações eficientes em matrizes multidimensionais.

Achatar Listas Python para Ciência de Dados com NumPy

Se você trabalha com ciência de dados em Python, é provável que já esteja familiarizado com a biblioteca NumPy. NumPy fornece uma função chamada flatten() que pode ser usada para achatar matrizes multidimensionais.

Aqui está como você pode usar numpy.flatten() para achatar uma matriz:

Python

import numpy as np
def achatar_numpy(matrix):
return np.array(matrix).flatten()

Dentro de achatar_numpy(), você usa np.array(matrix).flatten() para criar uma matriz NumPy a partir de matrix e, em seguida, chama a função flatten() dessa matriz para obter uma versão achatada.

Vamos testar a função:

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

Você verá a mesma lista achatada como saída:

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

A função numpy.flatten() é uma opção poderosa quando se trabalha com grandes conjuntos de dados e você precisa de desempenho otimizado.

Conclusão

Achatantar uma lista de listas é uma tarefa comum ao trabalhar com dados em Python. Existem várias abordagens para realizar esse objetivo, desde loops for e compreensões de lista até o uso de funções e métodos da biblioteca padrão e integradas.

Neste tutorial, você aprendeu como achatatar uma lista de listas em Python usando um loop for, compreensões de lista e ferramentas como itertools.chain(), functools.reduce() e sum(). Também exploramos o desempenho e como achatar listas usando a biblioteca NumPy para ciência de dados.

Agora você tem um conjunto variado de técnicas para achatar suas listas de listas em Python, dependendo de suas necessidades específicas. Experimente essas diferentes abordagens e escolha a que melhor se adapta ao seu código e aos seus dados.