Pular para o conteúdo

Como usar a função flatten para aplanar listas no Python?

CodeMDD.io

Como Aplanar uma Lista de Listas em Python

Às vezes, quando você está trabalhando com dados, pode ter os dados como uma lista de listas aninhadas. Uma operação comum é aplanar esses dados em uma lista unidimensional em Python. Aplanar uma lista envolve a conversão de uma lista multidimensional, como uma matriz, em uma lista unidimensional.

Para ilustrar melhor o que significa aplanar uma lista, digamos 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 armazena 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, digamos que você queira transformar esta matriz na seguinte lista:

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

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

Como Aplanhar uma Lista de Listas com um Loop for

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

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

Em seguida, você precisa de uma maneira de adicionar itens à nova lista aplanada. Para isso, você tem algumas opções válidas. Primeiro, você usará o método .extend() da própria classe list, e então utilizará o operador de concatenação aumentada (+=).

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

def aplanar_extend(matrix):
flat_list = []
for row in matrix:
flat_list.extend(row)
return flat_list

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

A cada iteração, você usa o .extend() para adicionar o conteúdo da sublista atual à flat_list. Este método recebe um iterável como argumento e anexa seus itens ao final da lista de destino.

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

result = aplanar_extend(matrix)
print(result)

Se tudo correr como esperado, você verá a lista aplanada resultante impressa no console.

Usando uma Compreensão para Aplanar uma Lista de Listas

Outra maneira elegante de aplanar uma lista de listas em Python é usar uma compreensão de lista. Uma compreensão de lista é uma construção concisa e poderosa que permite criar uma nova lista executando uma expressão em cada elemento de uma sequência.

No caso de aplanar uma lista de listas, você pode usar uma compreensão de lista que concatena todas as sublistas em uma única lista. Aqui está como isso ficaria usando a matrix como exemplo:

def aplanar_compreensao(matrix):
return [item for sublist in matrix for item in sublist]

Neste exemplo, você cria uma lista nova diretamente na instrução de retorno da função aplanar_compreensao(). Você itera sobre cada sublista em matrix com o primeiro for e, em seguida, itera sobre cada item em cada sublista com o segundo for. A expressão item é o elemento atual da sublista atual. Cada elemento é adicionado à nova lista, formando a lista aplanada.

Execute o seguinte código para verificar se sua função utilizando uma compreensão produz o resultado esperado:

result = aplanar_compreensao(matrix)
print(result)

Assim como antes, você verá a lista aplanada resultante impressa no console.

Aplanhando uma Lista Usando Ferramentas Padrão da Biblioteca e Nativas

Além das abordagens anteriores, existem outras ferramentas padrão da biblioteca e nativas do Python que você pode usar para aplanar uma lista de listas.

Encadeando Iteráveis com itertools.chain()

Um dessas ferramentas é o módulo itertools da biblioteca padrão do Python. Este módulo fornece várias funções para criar e manipular iteráveis de maneiras eficientes. Uma das funções úteis para aplanar uma lista de listas é a função chain().

A função chain() do módulo itertools é usada para criar um iterável que itera sequencialmente sobre vários iteráveis fornecidos. Para aplanar uma lista de listas, você pode usar chain() para encadear todas as sublistas em uma única sequência iterável.

Aqui está como você pode usar chain() para aplanar a matrix:

import itertools
def aplanar_chain(matrix):
return list(itertools.chain.from_iterable(matrix))

Neste exemplo, você importa o módulo itertools e, em seguida, usa a função from_iterable() do itertools.chain() para criar um iterável que contém todos os elementos das sublistas de matrix. Você converte esse iterável em uma lista usando a função list() para obter a lista aplanada resultante.

Execute o seguinte código para verificar se sua função com chain() produz o resultado esperado:

result = aplanar_chain(matrix)
print(result)

Você verá a lista aplanada resultante impressa no console.

Concatenando Listas com functools.reduce()

Outra ferramenta útil para aplanar uma lista de listas é o módulo functools da biblioteca padrão do Python. Este módulo fornece várias funções de alta ordem para manipulação de funções e objetos relacionados.

Uma dessas funções é a função reduce(), que é usada para aplicar uma função a uma sequência de elementos de forma acumulativa. Para aplanar uma lista de listas, você pode usar reduce() para concatenar todas as sublistas em uma única lista.

Aqui está como você pode usar reduce() para aplanar a matrix:

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

Neste exemplo, você importa o módulo functools e, em seguida, usa o functools.reduce() para aplicar a função lambda lambda x, y: x + y a todos os elementos de matrix de forma acumulativa, concatenando as sublistas em uma única lista.

Execute o seguinte código para verificar se sua função com reduce() produz o resultado esperado:

result = aplanar_reduce(matrix)
print(result)

Você verá a lista aplanada resultante impressa no console.

Usando sum() para Concatenar Listas

Uma abordagem alternativa para aplanar uma lista de listas é usar a função sum(). Embora essa função seja comumente usada para calcular a soma dos valores de uma sequência, você também pode usá-la para concatenar listas.

Aqui está como você pode usar sum() para aplanar a matrix:

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

Neste exemplo, você passa [] como o segundo argumento para a função sum(). Isso instrui o sum() a concatenar as sublistas em uma nova lista vazia, resultando na lista aplanada desejada.

Execute o seguinte código para verificar se sua função com sum() produz o resultado esperado:

result = aplanar_sum(matrix)
print(result)

Você verá a lista aplanada resultante impressa no console.

Considerando o Desempenho ao Aplanhar Suas Listas

Ao aplanhar listas em Python, é importante considerar o desempenho das diferentes abordagens. Para listas pequenas, como a matrix usada nos exemplos anteriores, todas as abordagens fornecem resultados aceitáveis. No entanto, quando você está trabalhando com listas grandes ehttps://codemdd.io/ou dados sensíveis ao desempenho, pode ser importante escolher a abordagem mais eficiente.

As abordagens usando loops for e compreensões de lista são geralmente mais eficientes para listas pequenas. Por outro lado, as abordagens usando as ferramentas padrão da biblioteca, como itertools.chain() e functools.reduce(), ou a função nativa sum(), geralmente superam as outras abordagens em desempenho para listas grandes.

Além disso, se você estiver trabalhando com dados científicos ou realizando análises de dados em Python, pode ser vantajoso usar a biblioteca NumPy para aplanar listas. A biblioteca NumPy possui uma função flatten() que permite aplanejar matrizes e outros objetos de array multidimensionais de forma eficiente.

Conclusão

Neste tutorial, você aprendeu várias maneiras de aplanhar uma lista de listas em Python. Você viu como usar um loop for e o método .extend() para criar uma nova lista aplanada, bem como como usar uma compreensão de lista para criar essa lista de forma mais concisa.

Você também explorou o uso de ferramentas padrão da biblioteca e funções nativas, como itertools.chain(), functools.reduce() e sum(), para aprimorar a eficiência ao aplanhar listas grandes. E, para as necessidades de ciência de dados, você viu como a biblioteca NumPy pode ser útil para aplanar listas multidimensionais.

Agora você tem várias opções para aplanar suas listas em Python, dependendo do tamanho dos dados e do desempenho desejado. Experimente as diferentes abordagens em seus próprios projetos e escolha a que melhor se adapta às suas necessidades.