Como Aplanar uma Lista em Python

Aliaksei Yursha 25 junho 2020
  1. Lista Python de achatamento rasa
  2. Python listar deep flattening
Como Aplanar uma Lista em Python

Flattening é uma operação onde pegamos uma lista de listas aninhadas e a convertemos em uma estrutura de dados diferente que não contém listas aninhadas.
Em vez disso, ela inclui todos os elementos de todas as listas, que foram inicialmente aninhadas.
Tal estrutura de dados é chamada de plat ou lista flattened.

A lista original pode conter listas aninhadas apenas no primeiro nível de aninhamento, para
exemplo [[1, 2], [3, 4]].
Caso contrário, ele contém listas no segundo, terceiro e outros níveis de nestadness,
por exemplo [[[1], [2]], [3, 4]].
Diz-se que tal lista contém dedepois de listas aninhadas.

Se nós quisermos desnudar apenas um único nível de nestadness, nós a chamamos de shallow flattening.
Se quisermos anular todos os níveis de anestesia, chamamos-lhe deep flattening.

Lista Python de achatamento rasa

Uma abordagem simples para entender e visualizar é utilizar um loop duplo for.

O primeiro laço for atravessa listas aninhadas. O segundo for loop itera sobre os elementos de cada lista aninhada e anexa-os a uma lista plana de resultados um por um.

>>> flat_list = []
>>> original_list = [[1, 2], [3, 4]]
>>> for l in original_list:
...   for item in l:
...     flat_list.append(item)
...
>>> flat_list
[1, 2, 3, 4]

O método acima é claro e legível, mas a expressividade do Python permite
para alcançarmos o mesmo objectivo numa só linha.
Aqui o Python lista compreensões vem para ajudar.

>>> original_list = [[1, 2], [3, 4]]
>>> flat_list = [item for l in original_list for item in l]
>>> flat_list
[1, 2, 3, 4]

Se você não precisa de uma lista plana por si só, mas quer ser capaz de iterar sobre todos os elementos
de todas as sublistas como se fossem provenientes de uma única estrutura de dados plana, você pode utilizar itertools.chain().

>>> import itertools
>>> original_list = [[1, 2], [3, 4]] 
>>> iterator = itertools.chain(*original_list)
>>> for item in iterator:
...   print(item)
...
1
2
3
4

Se você utilizar Pandas - um pacote open-source para análise de dados em Python - há uma forma integrada também.

>>> from pandas.core.common import flatten
>>> original_list = [[1, 2], [3, 4]]  
>>> flat_list = list(flatten(original_list))
>>> flat_list
[1, 2, 3, 4]

Python listar deep flattening

Como mencionado acima, o achatamento superficial não vai funcionar, se tivermos listas profundamente aninhadas.
Ele não funcionará apenas o primeiro nível de nestadness, como mostrado no exemplo abaixo.

>>> deeply_nested_list = [[[1, 2], 3], [4, 5, 6]]
>>> flat_list = [item for l in deeply_nested_list for item in l]
>>> flat_list
[[1, 2], 3, 4, 5, 6]

Para fazer o achatamento profundo, utilize iteration_utilities.deepflatten() do pacote iteration-utilities PyPI.

Primeiro, instale o próprio pacote PyPI.

$ pip install iteration-utilities

Em seguida, aplainar suas listas profundamente aninhadas.

>>> from iteration_utilities import deepflatten
>>> deeply_nested_list = [[[1, 2], 3], [4, 5, 6]]
>>> flat_list = list(deepflatten(deeply_nested_list))
>>> flat_list
[1, 2, 3, 4, 5, 6]

Artigo relacionado - Python List