Como usar a função flatten no Python?
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
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
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:
- Criar uma nova lista vazia para armazenar os dados achatarados.
- Iterar sobre cada lista aninhada ou sublista na lista original.
- Adicionar cada item da sublista atual à lista de dados achatarados.
- 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
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:
Você verá a lista achatada como saída:
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
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:
A lista achatada será a mesma:
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
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:
Você obterá a mesma lista achatada:
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
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:
O resultado será a mesma lista achatada:
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
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:
Você obterá a mesma lista achatada:
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
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:
Você verá a mesma lista achatada como saída:
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.