Cara Meratakan Daftar Daftar dengan Python

Pelajari cara meratakan daftar dengan Python. Bandingkan pemahaman daftar bersarang, itertools.chain, sum, dan metode rekursif dengan contoh kode.

Coba Solusi ini di Editor

Ikhtisar

Saat bekerja dengan penghitungan matriks, baris database, atau pohon data yang diurai, Anda akan sering menemukan struktur bertingkat, seperti daftar daftar: `[[1, 2], [3, 4]]`. Meratakan struktur ini berarti mengubahnya menjadi daftar satu dimensi yang berisi semua elemen individual: `[1, 2, 3, 4]`. Python menawarkan beberapa cara elegan untuk mencapai hal ini.

Cara paling umum dan pythonic untuk meratakan daftar adalah menggunakan pemahaman daftar bersarang: `[item untuk sublist dalam matriks untuk item dalam sublist]`. Meskipun sintaksisnya mungkin terlihat sedikit kontra-intuitif pada awalnya karena loop ditulis dalam urutan yang sama dengan loop `for` yang disarangkan, sintaksisnya sangat optimal, cepat, dan tidak memerlukan impor pustaka eksternal.

Alternatifnya, Anda dapat menggunakan fungsi `chain.from_iterable()` modul `itertools`. Ini adalah pendekatan yang paling hemat memori karena mengembalikan iterator yang menghasilkan elemen dengan malas daripada segera mengalokasikan daftar baru ke memori. Untuk daftar yang sangat bertumpuk (dengan kedalaman yang berubah-ubah), Anda harus menulis fungsi generator rekursif untuk membongkar semua level.

Kode & Output Eksekusi

Skrip ini mendemonstrasikan perataan daftar menggunakan pemahaman daftar, itertools.chain, dan pembongkaran rekursif.

flatten_list.py
Coba di 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))
Keluaran 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]

Implementasi Langkah demi Langkah

  • Gunakan pemahaman daftar bersarang [item untuk sublist di nested_list untuk item dalam sublist] untuk struktur 2D datar.
  • Impor itertools dan panggil itertools.chain.from_iterable(nested_list) untuk evaluasi yang lambat dan ramah memori.
  • Tentukan fungsi rekursif yang memeriksa isinstance(item, list) untuk menangani koleksi bersarang secara sewenang-wenang.

Pertanyaan yang Sering Diajukan

Bisakah saya menggunakan fungsi sum() untuk meratakan daftar?

Ya, sum(matrix, []) akan berhasil, tetapi sangat tidak disarankan. Ini berjalan dalam kompleksitas O(N^2) karena membuat salinan daftar baru pada setiap penambahan, menyebabkan kinerja buruk untuk kumpulan data besar.

Apa metode tercepat untuk meratakan daftar daftar?

itertools.chain.from_iterable() biasanya merupakan yang tercepat, diikuti oleh pemahaman daftar bersarang.

Topik Terkait

Sumber Daya Python yang Direkomendasikan

Perluas pengetahuan Anda dengan tutorial interaktif terkait, lembar contekan, dan perbandingan kode.