İç içe geçmiş bir listeyi tek seviyeli bir listeye dönüştürme işlemi olan listeyi düzleştirme, Python’da yaygın bir görevdir. Bu makale, bunu başarmak için çeşitli teknikleri inceleyerek bunları düzleştirme derinliklerine göre kategorize eder: sığ ve derin.
İçerik Tablosu
Sığ Düzleştirme
Sığ düzleştirme yalnızca bir seviye iç içe geçmeyi kaldırır. İç listelerin daha fazla iç içe geçmiş yapı içermediği durumlarda, listelerin listesine sahip olduğunuzda idealdir. İki verimli yöntem mevcuttur:
Liste Anlama (List Comprehension): Bu, özlü ve okunabilir bir çözüm sağlar:
nested_list = [[1, 2, 3], [4, 5], [6]]
flat_list = [item for sublist in nested_list for item in sublist]
print(flat_list) # Çıktı: [1, 2, 3, 4, 5, 6]
itertools.chain.from_iterable
: Daha büyük listeler için, bu yaklaşım optimize edilmiş yinelemesi nedeniyle daha iyi performans sunar:
from itertools import chain
nested_list = [[1, 2, 3], [4, 5], [6]]
flat_list = list(chain.from_iterable(nested_list))
print(flat_list) # Çıktı: [1, 2, 3, 4, 5, 6]
Sınırlamalar: Sığ düzleştirme, iç içe geçmiş listelerin iç içe geçmiş listeleri içeren listeleri tamamen düzleştiremez. Örneğin:
nested_list = [[1, 2, [3, 4]], [5, 6]]
flat_list = [item for sublist in nested_list for item in sublist]
print(flat_list) # Çıktı: [1, 2, [3, 4], 5, 6]
[3, 4]
iç listesi iç içe kalır.
Derin Düzleştirme
Derin düzleştirme, herhangi bir derinlikteki iç içe geçmiş listeleri yinelemeli olarak işler. İki temel yaklaşım mevcuttur:
Yinelemeli Fonksiyon: Bu zarif çözüm, iç içe geçmiş yapıyı dolaşmak için yinelemeyi kullanır:
def flatten(nested_list):
flat_list = []
for item in nested_list:
if isinstance(item, list):
flat_list.extend(flatten(item))
else:
flat_list.append(item)
return flat_list
nested_list = [[1, 2, [3, 4]], [5, 6, [7, [8, 9]]]]
flat_list = flatten(nested_list)
print(flat_list) # Çıktı: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Yinelemeli Yaklaşım (yığın kullanarak): Yineleme, aşırı derecede derin iç içe geçmelerde yığın taşması hatalarına yol açabilir. Yığın kullanan yinelemeli bir yaklaşım sağlamlık sağlar:
def flatten_iterative(nested_list):
flat_list = []
stack = [nested_list]
while stack:
current = stack.pop()
if isinstance(current, list):
stack.extend(current)
else:
flat_list.append(current)
return flat_list
nested_list = [[1, 2, [3, 4]], [5, 6, [7, [8, 9]]]]
flat_list = flatten_iterative(nested_list)
print(flat_list) # Çıktı: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Sonuç
Sığ ve derin düzleştirme arasında seçim, tamamen iç içe geçmiş listelerinizin yapısına bağlıdır. Sığ düzleştirme, tek seviyeli iç içe geçme için yeterlidir ve özlü, verimli çözümler sunar. Bununla birlikte, keyfi olarak iç içe geçmiş listeler için, sağlamlık için tercih edilen yinelemeli yığın tabanlı yaklaşımı kullanan derin düzleştirme gereklidir.