Como nivelar uma lista de listas em Python

Aprenda como nivelar uma lista de listas em Python. Compare compreensões de lista aninhada, itertools.chain, soma e métodos recursivos com exemplos de código.

Experimente esta solução no Editor

Visão geral

Ao trabalhar com cálculos de matrizes, linhas de banco de dados ou árvores de dados analisadas, você encontrará frequentemente estruturas aninhadas, como uma lista de listas: `[[1, 2], [3, 4]]`. Achatar esta estrutura significa convertê-la em uma lista unidimensional contendo todos os elementos individuais: `[1, 2, 3, 4]`. Python oferece várias maneiras elegantes de conseguir isso.

A maneira mais comum e Python de nivelar uma lista de listas é usar uma compreensão de lista aninhada: `[item para sublista na matriz para item na sublista]`. Embora a sintaxe possa parecer um pouco contra-intuitiva no início porque os loops são escritos na mesma ordem que um loop `for` aninhado, ela é altamente otimizada, rápida e não requer a importação de bibliotecas externas.

Alternativamente, você pode usar a função `chain.from_iterable()` do módulo `itertools`. Esta é a abordagem com maior eficiência de memória porque retorna um iterador que produz elementos preguiçosamente, em vez de alocar uma nova lista na memória imediatamente. Para listas profundamente aninhadas (com profundidade arbitrária), você deve escrever uma função geradora recursiva para descompactar todos os níveis.

Saída de código e execução

Este script demonstra como nivelar uma lista de listas usando compreensões de lista, itertools.chain e descompactação recursiva.

flatten_list.py
Experimente no Editor
import itertools

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

# Method 1: List comprehension (Pythonic and fast)
flat_comp = [item for sublist in matrix for item in sublist]
print("List comprehension:", flat_comp)

# Method 2: itertools.chain (Highly memory efficient)
flat_chain = list(itertools.chain.from_iterable(matrix))
print("itertools.chain:", flat_chain)

# Method 3: Recursive function for deep/irregular nesting
irregular = [1, [2, 3], [[4, 5], 6]]

def flatten_deep(items):
    result = []
    for item in items:
        if isinstance(item, list):
            result.extend(flatten_deep(item))
        else:
            result.append(item)
    return result

print("Deep flatten:", flatten_deep(irregular))
Saída terminal
List comprehension: [1, 2, 3, 4, 5, 6, 7, 8]
itertools.chain: [1, 2, 3, 4, 5, 6, 7, 8]
Deep flatten: [1, 2, 3, 4, 5, 6]

Implementação passo a passo

  • Use uma compreensão de lista aninhada [item para sublista em nested_list para item em sublista] para estruturas 2D planas.
  • Importe itertools e chame itertools.chain.from_iterable(nested_list) para uma avaliação preguiçosa e com memória amigável.
  • Defina uma função recursiva que verifica isinstance(item, list) para lidar com coleções aninhadas arbitrariamente.

Perguntas frequentes

Posso usar a função sum() para nivelar listas?

Sim, sum(matrix, []) funcionará, mas é altamente desencorajado. Ele é executado em complexidade O (N ^ 2) porque cria uma nova cópia da lista a cada adição, causando péssimo desempenho para grandes conjuntos de dados.

Qual é o método mais rápido para nivelar listas de listas?

itertools.chain.from_iterable() geralmente é o mais rápido, seguido de perto pelas compreensões de listas aninhadas.

Tópicos Relacionados

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.