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.
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.
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))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
Pelajari cara menggunakan pemahaman daftar dengan Python. Tulis loop ringkas, terapkan filter bersyarat, dan buat matriks dengan sintaksis visual yang bersih.
Cara Memotong Daftar dengan PythonPelajari cara mengiris daftar dengan Python menggunakan sintaks braket yang kuat. Kuasai argumen mulai, berhenti, dan langkah, pengindeksan negatif, dan daftar pembalikan.
Sumber Daya Python yang Direkomendasikan
Perluas pengetahuan Anda dengan tutorial interaktif terkait, lembar contekan, dan perbandingan kode.
Variabel Python & Tipe Data Dijelaskan
Memahami variabel Python dan tipe data inti (string, integer, float, boolean). Panduan pemula lengkap untuk penugasan memori dengan Python.
Lembar
Panduan referensi cepat untuk operasi daftar Python. Kuasai penambahan, penyisipan, penghapusan, pengurutan, dan pengirisan elemen.
Python vs JavaScript: Bahasa Pemrograman Mana yang Terbaik?
Perbandingan komprehensif antara Python dan JavaScript. Jelajahi perbedaan sintaksis, kinerja, kasus penggunaan (backend vs frontend), dan contoh pengkodean.