Python’da listeleri birleştirmek, veri manipülasyonunun temel taşlarından biridir. Peki, bu işlemi en verimli ve doğru şekilde nasıl yapabiliriz? Bu makalede, farklı senaryolar için 6’dan fazla etkili liste birleştirme yöntemini, performans ipuçlarını ve gerçek dünya örneklerini detaylıca inceleyeceğiz. İster yeni başlayan ister deneyimli bir geliştirici olun, listeleri birleştirme konusundaki bilgi birikiminizi artıracak kapsamlı bir rehber sizi bekliyor.
Python’da Listeleri Birleştirmek Neden Önemli? Temel Kavramlara Giriş
Python, esnek ve güçlü veri yapılarıyla bilinir ve listeler de bu yapılar arasında en sık kullanılanlardan biridir. Listeler, farklı türdeki elemanları sıralı bir şekilde depolayabilen, değiştirilebilir (mutable) ve dinamik boyutlu koleksiyonlardır. Veri analizi, web geliştirme, otomasyon veya herhangi bir programlama görevinde, çoğu zaman birden fazla kaynaktan gelen verileri bir araya getirme ihtiyacı duyarız. İşte bu noktada listeleri birleştirme teknikleri devreye girer. Birleştirme işlemi, iki veya daha fazla ayrı listeyi alıp tek bir liste halinde sunarak, veriler üzerinde daha kolay işlem yapmamızı, analiz etmemizi veya görselleştirmemizi sağlar.
Bu temel operasyonun doğru bir şekilde anlaşılması ve uygulanması, hem kodunuzun okunabilirliğini artırır hem de performans açısından kritik farklar yaratabilir. Örneğin, küçük listeler için basit bir yöntem yeterli olabilirken, milyonlarca eleman içeren büyük veri setlerini birleştirirken yanlış bir yöntem seçimi uygulamanızın yavaşlamasına veya belleğin tükenmesine neden olabilir. Bu nedenle, Python’da listeleri birleştirmenin farklı yollarını bilmek, her geliştiricinin araç kutusunda bulunması gereken önemli bir beceridir. Bu bölümde, listelerin temel özelliklerini kısaca hatırlayacak ve neden birleştirme ihtiyacı duyduğumuzu daha yakından inceleyeceğiz.
Python Listesi Nedir ve Neden Birleştirme Gereklidir?
Python’da bir liste, köşeli parantezler [] arasına virgülle ayrılmış elemanlar yazılarak oluşturulan bir veri koleksiyonudur. Listeler sıralıdır, yani elemanların bir sırası vardır ve bu sıra korunur. Ayrıca, değiştirilebilir oldukları için elemanları eklenebilir, çıkarılabilir veya güncellenebilir. En önemlisi, bir liste farklı veri tiplerini (sayılar, dizeler, boolean değerler, hatta başka listeler) aynı anda barındırabilir. Örneğin: [1, "elma", True, 3.14]. Bu esneklik, listeleri Python’daki en çok yönlü veri yapılarından biri yapar.
Peki, bu kadar esnek bir yapıda listeleri birleştirmeye neden ihtiyaç duyarız? İşte birkaç yaygın senaryo:
- Veri Entegrasyonu: Farklı kaynaklardan (örneğin, farklı sensörlerden, API’lerden, veritabanı sorgularından) gelen verileri tek bir analiz havuzunda toplamak.
- Modüler Programlama: Uygulamanın farklı bölümlerinde oluşturulan küçük listeleri, daha büyük bir işlem için tek bir bütün halinde birleştirmek.
- Kullanıcı Girdilerini Toplama: Kullanıcılardan parça parça alınan bilgileri veya seçimleri tek bir liste halinde konsolide etmek.
- Algoritma Geliştirme: Bir algoritmanın ara adımlarında oluşan veya ayrılan listeleri nihai sonuca ulaşmak için tekrar bir araya getirmek.
- Bellek Yönetimi ve Performans: Bazı durumlarda, büyük listeleri daha küçük parçalara bölüp üzerinde işlem yapmak ve ardından tekrar birleştirmek, bellek tüketimini optimize edebilir veya paralel işlemeyi kolaylaştırabilir.
Bu ihtiyaçlar doğrultusunda, Python’da listeleri birleştirmenin birden fazla yolu geliştirilmiştir. Her bir yöntemin kendine özgü avantajları, dezavantajları ve en uygun kullanım senaryoları vardır. Şimdi, bu yöntemleri tek tek inceleyelim.
Operatörlerle Liste Birleştirme: En Basit Yöntemler Nelerdir?
Python’da listeleri birleştirmenin belki de en sezgisel ve basit yolları, toplama (+) ve yıldız (*) operatörlerini kullanmaktır. Bu operatörler, dizeler üzerinde de benzer işlevler görür ve çoğu Python geliştiricisinin ilk öğrendiği yöntemler arasındadır. Ancak, basit olmaları her zaman en verimli oldukları anlamına gelmez. Özellikle büyük listelerle çalışırken bu operatörlerin davranışlarını ve performans etkilerini anlamak önemlidir.
Toplama Operatörü (+) ile İki Listeyi Birleştirme
Toplama operatörü (+), Python’da iki veya daha fazla listeyi birleştirmek için kullanılabilen en doğrudan yöntemdir. Bu operatör, sağdaki listenin elemanlarını soldaki listenin sonuna ekleyerek yeni bir liste oluşturur. Orijinal listeler üzerinde herhangi bir değişiklik yapmaz; her zaman yeni bir liste döndürür. Bu davranış, yan etkilerden kaçınmak istediğinizde avantajlı olabilir, ancak her birleştirme işleminde yeni bir liste oluşturulduğu için bellek ve performans açısından bazı dezavantajları da beraberinde getirir.
# Örnek 1: İki basit listeyi birleştirme
liste1 = [1, 2, 3]
liste2 = [4, 5, 6]
birlesik_liste = liste1 + liste2
print(f"Liste 1: {liste1}") # Orijinal liste değişmez
print(f"Liste 2: {liste2}") # Orijinal liste değişmez
print(f"Birleşik Liste (+ operatörü): {birlesik_liste}") # Çıktı: [1, 2, 3, 4, 5, 6]
# Örnek 2: Üç veya daha fazla listeyi birleştirme
liste3 = ['a', 'b']
liste4 = ['c', 'd']
liste5 = ['e', 'f']
tum_harfler = liste3 + liste4 + liste5
print(f"Tüm Harfler: {tum_harfler}") # Çıktı: ['a', 'b', 'c', 'd', 'e', 'f']
# Örnek 3: Boş bir listeyle birleştirme
liste_bos = []
liste_dolu = [10, 20]
sonuc_liste = liste_bos + liste_dolu
print(f"Boş liste ile birleştirme: {sonuc_liste}") # Çıktı: [10, 20]
Gördüğünüz gibi, + operatörü kullanımı oldukça basittir ve okunabilirliği yüksektir. Ancak, bu basitliğin bir maliyeti vardır. Her + işlemi, elemanları kopyalayarak yeni bir liste oluşturur. Eğer çok sayıda listeyi art arda birleştiriyorsanız veya çok büyük listelerle çalışıyorsanız, bu durum gereksiz bellek tahsisine ve performans düşüşüne yol açabilir. Çünkü her ara adımda geçici bir liste oluşturulur ve bu da ek kaynak tüketimi anlamına gelir. Bu nedenle, + operatörü genellikle küçük ve orta boyutlu listelerin birleştirilmesi için tercih edilmelidir.
Yıldız Operatörü (*) ile Listeleri Çoğaltma
Yıldız operatörü (*), Python’da listeleri birleştirmekten ziyade, mevcut bir listenin elemanlarını belirli bir sayıda tekrarlayarak yeni bir liste oluşturmak için kullanılır. Teknik olarak bir birleştirme yöntemi olmasa da, bazen aynı elemanların tekrarlandığı listeleri oluşturmak için dolaylı olarak bir “birleştirme” gibi düşünülebilir. Örneğin, belirli bir deseni veya başlangıç değerlerini içeren bir listeyi defalarca tekrarlamanız gerektiğinde bu yöntem oldukça kullanışlıdır.
# Örnek 1: Bir listeyi belirli sayıda çoğaltma
liste = [0, 1]
cogaltilmis_liste = liste * 3
print(f"Çoğaltılmış Liste (* operatörü): {cogaltilmis_liste}") # Çıktı: [0, 1, 0, 1, 0, 1]
# Örnek 2: Tek bir eleman içeren listeyi çoğaltma
tek_eleman = ['Python']
tekrar_eden_liste = tek_eleman * 4
print(f"Tekrar Eden Liste: {tekrar_eden_liste}") # Çıktı: ['Python', 'Python', 'Python', 'Python']
# Örnek 3: İç içe geçmiş listeleri çoğaltmanın dikkat edilmesi gereken yanı
# İç içe geçmiş listelerde, referanslar kopyalanır, elemanlar değil.
liste_ic_ice = [[1, 2]]
cogaltilmis_ic_ice = liste_ic_ice * 3
print(f"İç içe geçmiş çoğaltılmış liste başlangıç: {cogaltilmis_ic_ice}") # Çıktı: [[1, 2], [1, 2], [1, 2]]
# Şimdi bir alt listeyi değiştirirsek ne olur?
cogaltilmis_ic_ice[0][0] = 99
print(f"İç içe geçmiş çoğaltılmış liste sonrası değişiklik: {cogaltilmis_ic_ice}")
# Çıktı: [[99, 2], [99, 2], [99, 2]] - Tüm kopyalar etkilenir!
Yıldız operatörü, özellikle iç içe listelerle çalışırken dikkatli kullanılmalıdır. Yukarıdaki örnekte görüldüğü gibi, iç içe geçmiş bir listeyi çoğalttığınızda, aslında alt listelerin kendisi değil, onlara olan referanslar kopyalanır. Bu, alt listelerden birinde yapılan bir değişikliğin, diğer tüm “kopyaları” da etkileyeceği anlamına gelir. Bu durum, beklenmedik hatalara yol açabilir. Eğer iç içe geçmiş listeleri bağımsız kopyalar halinde çoğaltmak istiyorsanız, liste anlayışları veya copy modülü gibi farklı yaklaşımlar kullanmanız gerekir. Dolayısıyla, * operatörü, basit ve düz listeleri çoğaltmak için harika olsa da, daha karmaşık veri yapıları için alternatif çözümler düşünülmelidir.
extend() Metodu Kullanarak Listeleri Genişletme: Ne Zaman Tercih Edilmeli?
Python’da listeleri birleştirmenin en yaygın ve genellikle en verimli yollarından biri, extend() metodunu kullanmaktır. + operatörünün aksine, extend() metodu yeni bir liste oluşturmak yerine, mevcut bir listenin sonuna başka bir liste veya herhangi bir yinelenebilir (iterable) nesnenin elemanlarını ekleyerek listeyi yerinde (in-place) genişletir. Bu, özellikle büyük listelerle çalışırken bellek ve performans açısından önemli avantajlar sağlar.
extend() metodu, bir listenin elemanlarını doğrudan değiştirir, yani metod çağrıldıktan sonra ilk listeniz artık yeni elemanları içerecektir. Bu davranış, yeni bir liste oluşturma maliyetinden kaçınmak istediğinizde veya bir listeyi aşamalı olarak doldurmanız gerektiğinde idealdir. Metodun kendisi herhangi bir değer döndürmez (None döndürür), bu da onun yan etkisi olan bir işlem olduğunu gösterir.
# Örnek 1: İki listeyi extend() ile birleştirme
liste_ana = [1, 2, 3]
liste_ek = [4, 5, 6]
print(f"Başlangıçtaki Ana Liste: {liste_ana}") # Çıktı: [1, 2, 3]
liste_ana.extend(liste_ek)
print(f"extend() sonrası Ana Liste: {liste_ana}") # Çıktı: [1, 2, 3, 4, 5, 6]
print(f"Ek Liste: {liste_ek}") # Ek liste değişmez: [4, 5, 6]
# Örnek 2: Bir listeye tuple veya string gibi başka yinelenebilir nesneleri ekleme
sayilar = [10, 20]
rakamlar_tuple = (30, 40)
sayilar.extend(rakamlar_tuple)
print(f"Tuple ile genişletme: {sayilar}") # Çıktı: [10, 20, 30, 40]
metin = "Python"
harfler = ['P', 'y']
harfler.extend(metin) # Bir string de yinelenebilir olduğu için her karakteri tek tek ekler
print(f"String ile genişletme: {harfler}") # Çıktı: ['P', 'y', 'P', 'y', 't', 'h', 'o', 'n']
# Örnek 3: Boş bir listeyi genişletme
bos_liste = []
ilk_elemanlar = [100, 200]
bos_liste.extend(ilk_elemanlar)
print(f"Boş listeyi genişletme: {bos_liste}") # Çıktı: [100, 200]
Yukarıdaki örneklerden de anlaşılacağı üzere, extend() metodu sadece listelerle değil, herhangi bir yinelenebilir (iterable) nesneyle çalışabilir. Bu, onu oldukça esnek bir araç haline getirir. Bir tuple’ın veya bir dizenin elemanlarını bir listeye eklemek istediğinizde de extend() metodunu kullanabilirsiniz. Ancak, string ile genişletirken, string’in bir bütün olarak değil, karakter karakter eklendiğine dikkat edin.
extend() metodu, mevcut bir listeyi doğrudan değiştirdiği için, yeni bir liste oluşturma maliyetinden kaçınmak istediğinizde idealdir. Özellikle döngüler içinde veya çok sayıda küçük listeyi tek bir büyük listede toplarken performansı artırmak için + operatörüne göre daha iyi bir seçenektir. Ancak, orijinal listenin değişmesini istemiyorsanız, öncelikle listenin bir kopyasını oluşturup (örneğin liste_ana[:]) sonra extend() metodunu bu kopya üzerinde kullanmalısınız.
Performans açısından, extend() genellikle + operatöründen daha iyidir çünkü gereksiz ara listeler oluşturmaz. Liste elemanları yerinde genişletilir ve bu da daha az bellek tahsisine ve daha hızlı çalışmaya yol açar. Özellikle milyonlarca eleman içeren listelerle çalışırken, extend() metodunun sağladığı performans avantajı oldukça belirgin hale gelir. Bu nedenle, bir listeyi başka bir listenin elemanlarıyla büyütmeniz gerektiğinde ilk tercihiniz extend() olmalıdır.
Liste Anlayışları (List Comprehensions) ile Esnek Birleştirme Nasıl Yapılır?
Liste anlayışları (list comprehensions), Python’ın en güçlü ve “Pythonic” özelliklerinden biridir. Bir veya daha fazla yinelenebilir nesne üzerinde döngü kurarak, belirli bir koşulu karşılayan elemanları içeren yeni bir liste oluşturmanın kısa ve okunabilir bir yolunu sunarlar. Listeleri birleştirme bağlamında, özellikle iç içe geçmiş listeleri düzleştirmek (flatten) veya belirli koşullara göre elemanları seçerek birleştirmek istediğinizde liste anlayışları oldukça kullanışlıdır.
Liste anlayışları, genellikle tek bir satırda karmaşık döngü ve koşul mantığını ifade etmenize olanak tanır. Bu sayede kodunuz daha kompakt ve anlaşılır hale gelir. İç içe geçmiş liste anlayışları (nested list comprehensions) kullanarak, birden fazla alt listeden elemanları çekip tek bir düz listeye dönüştürebiliriz. Bu, özellikle veri biliminde veya veri işleme görevlerinde sıkça karşılaşılan bir senaryodur.
# Örnek 1: İç içe geçmiş listeleri düzleştirmek için liste anlayışı
listeler = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
birlesik_liste = [eleman for alt_liste in listeler for eleman in alt_liste]
print(f"Liste Anlayışı ile Düzleştirilmiş Liste: {birlesik_liste}")
# Çıktı: [1, 2, 3, 4, 5, 6, 7, 8, 9]
# Örnek 2: Belirli bir koşula göre elemanları birleştirme
sayi_listeleri = [[10, 20, 30], [5, 15, 25], [40, 50]]
cift_sayilar = [sayi for alt_liste in sayi_listeleri for sayi in alt_liste if sayi % 2 == 0]
print(f"Çift Sayılar (koşullu birleştirme): {cift_sayilar}")
# Çıktı: [10, 20, 30, 40, 50]
# Örnek 3: Farklı tiplerdeki listeleri tek bir liste anlayışı ile birleştirme (düzleştirme)
karisik_listeler = [['a', 'b'], (1, 2), ['x', 'y', 'z']]
birlesik_karisik = [item for sub_iterable in karisik_listeler for item in sub_iterable]
print(f"Karışık tipleri düzleştirme: {birlesik_karisik}")
# Çıktı: ['a', 'b', 1, 2, 'x', 'y', 'z']
Yukarıdaki ilk örnek, iç içe geçmiş listeleri düzleştirmenin klasik bir örneğini gösterir. for alt_liste in listeler döngüsü, dıştaki listeler listesindeki her bir alt listeyi alır. Ardından, for eleman in alt_liste döngüsü, her alt_liste içindeki her elemanı işler ve bu elemanları yeni birlesik_liste‘ye ekler. Bu yapı, birçok programlama dilinde iki ayrı döngü gerektiren bir işlemi tek bir satırda ifade etme olanağı sunar.
İkinci örnekte ise, liste anlayışının gücünü daha da ileri taşıdık. Sadece listeleri birleştirmekle kalmadık, aynı zamanda birleştirme işlemi sırasında bir koşul (if sayi % 2 == 0) uygulayarak sadece çift sayıları yeni listeye dahil ettik. Bu, veri filtreleme ve birleştirmeyi tek bir adımda yapmanızı sağlar, bu da kodu hem daha verimli hem de daha okunabilir hale getirir.
map() ve filter() gibi fonksiyonlarla elde edilebilecek sonuçları daha okunabilir ve genellikle daha hızlı bir şekilde sağlar. Özellikle karmaşık veri dönüşümleri ve filtrelemeleri birleştirmek istediğinizde tercih edilmelidir. Ancak, çok büyük veri setlerinde ve sadece basit birleştirme ihtiyacında extend() veya itertools.chain() daha performanslı olabilir.
Liste anlayışları, Python’da veri işleme ve manipülasyonu için vazgeçilmez bir araçtır. Listeleri esnek bir şekilde birleştirmek, düzleştirmek veya belirli kriterlere göre yeni listeler oluşturmak istediğinizde, bu yöntemi kullanmak kodunuzu daha modern, verimli ve Pythonic yapacaktır. Okunabilirliği ve gücü sayesinde, birçok geliştirici tarafından favori bir yöntem olarak kabul edilir.
itertools.chain() ile Büyük Veri Setlerinde Performanslı Birleştirme
Büyük veri setleriyle çalışırken veya bellek verimliliğinin kritik olduğu durumlarda, itertools modülü Python geliştiricilerinin en iyi dostlarından biri haline gelir. Bu modül, hızlı ve bellek verimli yineleyiciler (iterators) oluşturmak için özel olarak tasarlanmış bir dizi fonksiyon sunar. Listeleri birleştirme söz konusu olduğunda, itertools.chain() fonksiyonu, özellikle çok sayıda veya çok büyük listeyi birleştirmeniz gerektiğinde öne çıkan bir çözümdür.
itertools.chain() fonksiyonu, birden fazla yinelenebilir nesneyi (listeler, tuple’lar, kümeler vb.) tek bir ardışık yineleyici olarak ele alır. Diğer birleştirme yöntemlerinden farklı olarak, chain() yeni bir liste oluşturmaz. Bunun yerine, elemanları tek tek üreten bir yineleyici (iterator) döndürür. Bu, tüm elemanların aynı anda belleğe yüklenmesini gerektirmediği için bellek tüketimini önemli ölçüde azaltır. Sadece elemanlara ihtiyaç duyulduğunda üretildikleri için “tembel değerlendirme” (lazy evaluation) prensibini kullanır. Bu özellik, özellikle terabaytlarca veri içeren dosya listelerini veya veritabanı sorgularının sonuçlarını birleştirirken paha biçilmezdir.
import itertools
# Örnek 1: İki listeyi itertools.chain() ile birleştirme
liste1 = [1, 2, 3]
liste2 = [4, 5, 6]
birlesik_iterator = itertools.chain(liste1, liste2)
print(f"Birleşik Iterator Nesnesi: {birlesik_iterator}") # Çıktı: <itertools.chain object at 0x...>
# Iterator'ı bir listeye dönüştürmek için list() fonksiyonunu kullanın
birlesik_liste = list(birlesik_iterator)
print(f"itertools.chain() ile Birleşik Liste: {birlesik_liste}") # Çıktı: [1, 2, 3, 4, 5, 6]
# Örnek 2: Çok sayıda listeyi birleştirme
listeler_koleksiyonu = [[10, 20], [30], [40, 50, 60], [70]]
tum_sayilar_iterator = itertools.chain(*listeler_koleksiyonu) # Yıldız operatörü ile listeleri açma
tum_sayilar_liste = list(tum_sayilar_iterator)
print(f"Çoklu listelerden birleştirme: {tum_sayilar_liste}")
# Çıktı: [10, 20, 30, 40, 50, 60, 70]
# Örnek 3: Farklı yinelenebilir nesneleri birleştirme
tuple_veri = (100, 200)
set_veri = {300, 400} # Setler sıralı değildir, çıktı sırası değişebilir
string_veri = "ABC"
karisik_veri_iterator = itertools.chain(tuple_veri, set_veri, string_veri)
karisik_veri_liste = list(karisik_veri_iterator)
print(f"Karışık yinelenebilir nesneleri birleştirme: {karisik_veri_liste}")
# Çıktı: [100, 200, 300, 400, 'A', 'B', 'C'] (set'in sırası farklı olabilir)
İlk örnekte, itertools.chain(liste1, liste2) doğrudan bir liste döndürmek yerine bir chain nesnesi döndürür. Bu nesne, elemanlara tek tek erişmek için kullanılabilir. Tüm elemanları bir kerede belleğe almak istiyorsanız, list() fonksiyonu ile bu yineleyiciyi bir listeye dönüştürebilirsiniz. Ancak, chain()‘in asıl gücü, tüm listeyi belleğe almadan elemanlar üzerinde işlem yapabilmesidir.
İkinci örnekte, *listeler_koleksiyonu ifadesine dikkat edin. Bu, “argüman açma” (argument unpacking) olarak bilinen bir Python özelliğidir. listeler_koleksiyonu bir listeler listesi olduğu için, chain() fonksiyonuna doğrudan bu listeyi gönderirsek hata alırız. Çünkü chain() ayrı ayrı yinelenebilir nesneler bekler. Yıldız operatörü, listeler_koleksiyonu içindeki her bir alt listeyi ayrı bir argüman olarak chain() fonksiyonuna ileterek bu sorunu çözer. Bu, çok sayıda listeyi dinamik olarak birleştirmeniz gerektiğinde son derece kullanışlıdır.
itertools.chain() kullanmak, gereksiz kopyalama işlemlerini önleyerek performansı önemli ölçüde artırabilir. Ayrıca, dosya okuma işlemleri gibi, elemanların anlık olarak üretildiği senaryolarda da idealdir.
itertools.chain() sadece listelerle değil, herhangi bir yinelenebilir nesneyle çalışabilir. Tuple’lar, kümeler, dizeler ve hatta özel yineleyiciler bile chain() ile birleştirilebilir. Bu esneklik ve bellek dostu yaklaşım, onu Python’daki en güçlü liste birleştirme araçlarından biri yapar. Performans ve bellek tüketimi açısından endişeleriniz varsa, itertools.chain() her zaman göz önünde bulundurmanız gereken ilk yöntemlerden biri olmalıdır.
Yıldız İşareti (*) ile Argüman Açma (Unpacking) Yöntemi: Söz Dizimsel Şeker mi?
Python 3.5 ve sonraki sürümlerle birlikte gelen argüman açma (unpacking) özelliği, listeleri birleştirmenin hem şık hem de oldukça okunabilir bir yolunu sunar. Bu yöntem, bir listenin elemanlarını başka bir liste içine “sererek” yeni bir liste oluşturmanızı sağlar. Söz dizimi olarak + operatörüne benzer bir sonuç verse de, özellikle birden fazla listeyi bir araya getirirken daha esnek ve modern bir yaklaşım sunar. Bu özellik, genellikle “söz dizimsel şeker” (syntactic sugar) olarak adlandırılır, çünkü aslında altında yatan daha karmaşık bir işlemi daha basit ve anlaşılır bir şekilde ifade etmemize olanak tanır.
Unpacking operatörü (*), bir yinelenebilir nesneyi (örneğin bir liste veya tuple) alır ve onun elemanlarını ayrı ayrı değerler olarak “açar”. Listeleri birleştirmek için, açmak istediğiniz her listenin önüne bir yıldız işareti koyarak bunları yeni bir liste tanımının içine yerleştirirsiniz. Bu işlem, tıpkı + operatörü gibi, orijinal listeleri değiştirmez ve her zaman yeni bir liste döndürür.
# Örnek 1: İki listeyi unpacking ile birleştirme
liste_a = [1, 2, 3]
liste_b = [4, 5, 6]
birlesik_liste_unpack = [*liste_a, *liste_b]
print(f"Unpacking ile Birleşik Liste: {birlesik_liste_unpack}") # Çıktı: [1, 2, 3, 4, 5, 6]
# Örnek 2: Birden fazla listeyi ve hatta tek tek elemanları birleştirme
liste_c = ['elma', 'armut']
liste_d = ['kiraz']
tek_eleman = 'muz'
tum_meyveler = [*liste_c, *liste_d, tek_eleman, 'portakal']
print(f"Tüm Meyveler (karışık unpacking): {tum_meyveler}")
# Çıktı: ['elma', 'armut', 'kiraz', 'muz', 'portakal']
# Örnek 3: Tuple'ları ve listeleri aynı anda birleştirme
tuple_sayilar = (10, 20)
liste_harfler = ['A', 'B']
karisik_koleksiyon = [*tuple_sayilar, *liste_harfler, 30]
print(f"Karisik koleksiyon: {karisik_koleksiyon}")
# Çıktı: [10, 20, 'A', 'B', 30]
Gördüğünüz gibi, unpacking operatörü ile listeleri birleştirmek oldukça sezgisel ve görsel olarak da anlaşılırdır. Her bir *liste ifadesi, o listenin elemanlarını sanki tek tek yazılmış gibi yeni listeye ekler. Bu yöntem, özellikle birden fazla listeyi birleştirmek istediğinizde liste1 + liste2 + liste3 gibi uzun zincirlerden daha okunabilir olabilir.
Unpacking operatörünün bir diğer avantajı, sadece listelerle değil, herhangi bir yinelenebilir nesneyle (tuple, set, string vb.) çalışabilmesidir. Bu, farklı veri tiplerinden gelen elemanları tek bir liste içinde kolayca birleştirmenize olanak tanır. Örneğin, bir tuple’ın elemanlarını bir listenin içine açabilir veya bir string’in karakterlerini bir liste elemanı olarak ekleyebilirsiniz (tabii string’i eleman eleman açmak isterseniz).
+ operatörüne göre genellikle daha esnek kabul edilir. Performans açısından, küçük ve orta boyutlu listeler için + operatörüne benzer veya biraz daha iyi bir performans sergiler. Ancak, çok büyük listelerle çalışırken extend() veya itertools.chain() hala daha verimli seçenekler olabilir.
Sonuç olarak, yıldız işareti (*) ile argüman açma yöntemi, Python’da listeleri birleştirmenin güçlü, esnek ve “Pythonic” bir yoludur. Özellikle kodunuzun okunabilirliğini artırmak ve farklı yinelenebilir nesnelerden gelen elemanları kolayca birleştirmek istediğinizde bu yöntemi tercih edebilirsiniz. Modern Python kodunda sıkça karşımıza çıkan bu yapı, veri manipülasyonu görevlerinizi daha zarif bir şekilde çözmenize yardımcı olacaktır.
Farklı Yöntemlerin Performans Karşılaştırması ve Bellek Yönetimi İpuçları
Python’da listeleri birleştirmenin birden fazla yolu olduğunu gördük. Her bir yöntemin kendine özgü söz dizimi ve kullanım alanları varken, gerçek dünya uygulamalarında en kritik faktörlerden biri performans ve bellek tüketimidir. Özellikle büyük veri setleriyle çalışırken, yanlış bir yöntem seçimi uygulamanızın yavaşlamasına, hatta çökmesine neden olabilir. Bu bölümde, ele aldığımız yöntemleri performans ve bellek verimliliği açısından karşılaştıracak ve hangi senaryoda hangi yöntemin daha uygun olduğuna dair ipuçları vereceğiz.
Genel bir kural olarak, birleştirme işlemi sırasında yeni bir liste oluşturan yöntemler (örneğin + operatörü, unpacking operatörü *, liste anlayışları) genellikle mevcut listeyi yerinde değiştiren yöntemlere (extend()) göre daha fazla bellek tüketir ve potansiyel olarak daha yavaş çalışır. Bunun nedeni, her yeni liste oluşturulduğunda, önceki listelerin elemanlarının kopyalanması ve yeni bellek alanının tahsis edilmesidir. itertools.chain() ise tamamen farklı bir yaklaşım benimseyerek bu bellek ve performans sorunlarının çoğunu ortadan kaldırır.
Yöntemlerin Karşılaştırmalı Analizi:
| Yöntem | Açıklama | Performans Notu | Bellek Kullanımı |
|---|---|---|---|
+ Operatörü |
İki veya daha fazla listeyi birleştirerek yeni bir liste oluşturur. | Küçük listeler için okunabilir ve yeterli. Büyük listelerde çok sayıda geçici liste oluşturduğu için yavaşlayabilir. | Yüksek (Her işlemde yeni liste kopyası) |
extend() Metodu |
Mevcut bir listeyi başka bir yinelenebilir nesnenin elemanlarıyla yerinde genişletir. | Çoğu durumda en hızlı ve bellek dostu yöntemlerden biridir, çünkü yeni bir liste oluşturmaz. | Düşük (Yerinde değişiklik) |
| Liste Anlayışı | İç içe geçmiş listeleri düzleştirmek veya koşullu birleştirmeler yapmak için esnektir. Yeni bir liste oluşturur. | + operatöründen genellikle daha hızlıdır ancak extend() kadar hızlı olmayabilir. Esnekliği sayesinde tercih edilir. |
Orta (Yeni liste oluşturur) |
itertools.chain() |
Birden fazla yinelenebilir nesneyi tek bir yineleyici olarak ele alır. Yeni bir liste oluşturmaz, yineleyici döndürür. | Büyük listeler için en iyi performans ve bellek kullanımı. Elemanları “tembel” olarak yükler. | Çok Düşük (Sadece yineleyici referansları tutar) |
Unpacking (*) |
Bir veya daha fazla listeyi yeni bir liste tanımının içine elemanlarını açarak birleştirir. | Okunabilir ve modern. Performansı + operatörüne benzer veya biraz daha iyidir. Büyük listelerde yine de yeni liste kopyası oluşturur. |
Yüksek (Yeni liste kopyası) |
Bellek Yönetimi İpuçları:
- Yerinde Değişiklikleri Tercih Edin (
extend()): Eğer orijinal listenin değişmesi sorun değilse ve yeni bir liste oluşturma maliyetinden kaçınmak istiyorsanız,extend()metodunu kullanın. Bu, bellek tahsisini minimize eder ve genellikle en iyi performansı sağlar. - Yineleyicileri Kullanın (
itertools.chain()): Özellikle çok büyük veri setleriyle veya dinamik olarak oluşturulan verilerle çalışırken, tüm veriyi belleğe aynı anda yüklemek yerineitertools.chain()gibi yineleyicileri kullanın. Bu, sadece ihtiyaç duyulduğunda elemanları üreterek bellek ayak izini önemli ölçüde azaltır. Eğer tüm veriye bir liste olarak ihtiyacınız varsa, yineleyiciyilist()fonksiyonu ile listeye dönüştürebilirsiniz, ancak bu işlemi en son aşamada yapın. - Gereksiz Kopyalamadan Kaçının:
+operatörü ve unpacking (*) ile her birleştirme işleminde yeni bir liste kopyası oluşturulur. Bu, özellikle bir döngü içinde çok sayıda birleştirme yapıldığında performansı düşürebilir. Mümkünse, bu tür senaryolardaextend()veyaitertools.chain()gibi alternatifleri değerlendirin. - Liste Anlayışlarını Akıllıca Kullanın: Liste anlayışları, kodun okunabilirliğini ve verimliliğini artırır, ancak yine de yeni bir liste oluştururlar. Basit birleştirme için
extend()daha iyi olabilirken, karmaşık filtreleme veya dönüşümlerle birlikte birleştirme yapmanız gerektiğinde liste anlayışları çok güçlüdür.
timeit modülü ile) her zaman en doğru sonucu verecektir. Kendi özel kullanım durumunuz için farklı yöntemleri test etmek, hangi yöntemin en uygun olduğunu belirlemenin en iyi yoludur. Ancak genel olarak, bellek verimliliği ve hız için extend() ve itertools.chain() güçlü adaylardır.
Sonuç olarak, Python’da listeleri birleştirirken “tek bir en iyi yöntem” yoktur. Seçiminiz, listenin boyutu, birleştirme sıklığı, bellek kısıtlamaları ve kodun okunabilirliği gibi faktörlere bağlı olmalıdır. Küçük ve orta boyutlu listeler için + veya unpacking yeterliyken, büyük veri setleri ve performans kritik uygulamalar için extend() ve itertools.chain() vazgeçilmezdir. Doğru yöntemi seçmek, uygulamanızın genel kalitesini ve verimliliğini önemli ölçüde artıracaktır.
Gerçek Dünya Senaryosu: Veri Analizinde Birden Fazla Kaynaktan Gelen Listeleri Birleştirme
Şimdiye kadar Python’da listeleri birleştirmenin çeşitli tekniklerini ve bunların performans özelliklerini inceledik. Bu bilgileri gerçek bir dünya senaryosuna uygulayarak, farklı yöntemlerin ne zaman ve neden tercih edildiğini daha iyi anlayabiliriz. Veri analizi, listeleri birleştirme ihtiyacının en sık ortaya çıktığı alanlardan biridir. Genellikle, veriler farklı kaynaklardan gelir ve analizden önce tek bir yapı altında toplanması gerekir. Bu senaryoda, farklı sensörlerden veya veri akışlarından gelen sıcaklık verilerini birleştirmeyi ele alalım.
Hayal edin ki, bir binanın farklı katlarında veya odalarında bulunan üç ayrı sıcaklık sensöründen anlık veri alıyorsunuz. Her sensör, kendi ölçüm listesini döndürüyor. Amacımız, tüm bu sıcaklık verilerini tek bir liste halinde toplamak ve üzerinde ortalama sıcaklık hesaplamak gibi analizler yapmak. Bu, birçok IoT (Nesnelerin İnterneti) veya çevresel izleme uygulamasında karşılaşılabilecek tipik bir durumdur.
# Farklı sensörlerden gelen sıcaklık verileri (örnek listeler)
sensor1_verileri = [22.5, 23.1, 22.9, 23.0] # 1. kat sensörü
sensor2_verileri = [23.0, 23.5, 23.2, 23.8] # 2. kat sensörü
sensor3_verileri = [22.8, 23.3, 23.0, 23.1] # 3. kat sensörü
sensor4_verileri = [24.0, 24.1, 23.9, 24.2] # Çatı katı sensörü (sonradan eklendi)
print("--- + Operatörü ile Birleştirme ---")
# En basit yöntem: + operatörü ile birleştirme
# Bu yöntem, az sayıda ve küçük listeler için oldukça okunabilirdir.
tum_sicakliklar_arti = sensor1_verileri + sensor2_verileri + sensor3_verileri
print(f"Tüm sıcaklık verileri (+ operatörü): {tum_sicakliklar_arti}")
print(f"Toplam veri adedi: {len(tum_sicakliklar_arti)}\n")
print("--- extend() Metodu ile Birleştirme ---")
# Daha verimli yöntem: extend() metodu ile birleştirme
# Eğer orijinal listelerden birini genişletmek istiyorsak veya
# çok sayıda listeyi dinamik olarak birleştiriyorsak tercih edilir.
# Boş bir listeyle başlayıp üzerine ekleme yapmak iyi bir pratiktir.
tum_sicakliklar_extend = []
tum_sicakliklar_extend.extend(sensor1_verileri)
tum_sicakliklar_extend.extend(sensor2_verileri)
tum_sicakliklar_extend.extend(sensor3_verileri)
tum_sicakliklar_extend.extend(sensor4_verileri) # Yeni sensör verisi eklendi
print(f"Tüm sıcaklık verileri (extend): {tum_sicakliklar_extend}")
print(f"Toplam veri adedi: {len(tum_sicakliklar_extend)}\n")
print("--- Unpacking (*) Operatörü ile Birleştirme ---")
# Modern ve okunabilir yöntem: Unpacking operatörü ile birleştirme
# Özellikle birden fazla listeyi tek bir ifadeyle birleştirmek istediğinizde şık bir çözümdür.
tum_sicakliklar_unpacking = [*sensor1_verileri, *sensor2_verileri, *sensor3_verileri, *sensor4_verileri]
print(f"Tüm sıcaklık verileri (unpacking): {tum_sicakliklar_unpacking}")
print(f"Toplam veri adedi: {len(tum_sicakliklar_unpacking)}\n")
print("--- itertools.chain() ile Performanslı Birleştirme ---")
# Büyük veri setleri için en iyisi: itertools.chain()
# Eğer sensörlerden gelen veriler çok büyükse veya dinamik olarak akıyorsa,
# bellek verimliliği açısından bu yöntem öne çıkar.
import itertools
tum_sensor_listeleri = [sensor1_verileri, sensor2_verileri, sensor3_verileri, sensor4_verileri]
tum_sicakliklar_itertools_iterator = itertools.chain(*tum_sensor_listeleri)
# Sadece ihtiyaç duyulduğunda listeye çeviriyoruz
tum_sicakliklar_itertools = list(tum_sicakliklar_itertools_iterator)
print(f"Tüm sıcaklık verileri (itertools.chain): {tum_sicakliklar_itertools}")
print(f"Toplam veri adedi: {len(tum_sicakliklar_itertools)}\n")
print("--- Liste Anlayışı (List Comprehension) ile Birleştirme ---")
# İç içe listeleri düzleştirmek için: Liste Anlayışı
# Sensör verileri zaten bir liste listesi olarak geldiyse veya ek işlem yapacaksak
tum_sicakliklar_list_comp = [veri for sensor_listesi in tum_sensor_listeleri for veri in sensor_listesi]
print(f"Tüm sıcaklık verileri (liste anlayışı): {tum_sicakliklar_list_comp}")
print(f"Toplam veri adedi: {len(tum_sicakliklar_list_comp)}\n")
# Örnek Analiz: Ortalama sıcaklık hesaplama
if tum_sicakliklar_unpacking: # Herhangi bir listenin dolu olduğunu varsayarak
ortalama_sicaklik = sum(tum_sicakliklar_unpacking) / len(tum_sicakliklar_unpacking)
print(f"Ortalama sıcaklık: {ortalama_sicaklik:.2f}°C")
Bu senaryoda, her bir birleştirme yöntemini uyguladık ve sonuçları karşılaştırdık. Gördüğümüz gibi:
+Operatörü: En basit ve anlaşılır yöntem. Küçük ve sabit sayıda listeyi birleştirmek için uygundur. Ancak, her birleştirme işleminde yeni bir liste oluşturur.extend()Metodu: Eğer verileri dinamik olarak toplayıp mevcut bir listeyi genişletmeniz gerekiyorsa (örneğin, bir döngü içinde),extend()en verimli seçenektir. Orijinal listeyi yerinde değiştirir.- Unpacking (
*) Operatörü: Modern Python kodunda oldukça popülerdir.+operatörüne benzer bir okunabilirlik sunar ancak daha esnektir. Çok sayıda listeyi bir kerede birleştirmek için şık bir çözümdür. itertools.chain(): Eğer sensörlerden gelen veriler çok büyükse veya bir akış halinde geliyorsa,itertools.chain()bellek dostu bir çözüm sunar. Verileri liste olarak değil, bir yineleyici olarak işler, böylece tüm veriyi belleğe aynı anda yüklemez. Analizden öncelist()ile listeye dönüştürmek gerekebilir.- Liste Anlayışı: Özellikle iç içe geçmiş listeleri düzleştirmek veya birleştirme sırasında veriye ek filtreleme/dönüştürme uygulamak istediğinizde güçlüdür.
Bu vaka analizi, farklı yöntemlerin yalnızca söz dizimi olarak değil, aynı zamanda performans ve kullanım senaryoları açısından da nasıl farklılık gösterdiğini açıkça ortaya koymaktadır. Doğru yöntemi seçmek, uygulamanızın verimliliğini ve ölçeklenebilirliğini doğrudan etkileyecektir.
Mobil Uyumlu HTML ve CSS Notu: Neden Önemli?
Bu teknik makale doğrudan Python listelerini birleştirmeyi ele alsa da, web üzerinde yayınlanacak her türlü içeriğin mobil uyumlu (responsive) olması günümüz standartlarında kritik bir öneme sahiptir. Kullanıcı deneyimini artırmak, farklı cihazlarda içeriğin doğru ve okunabilir bir şekilde görüntülenmesini sağlamak ve arama motoru sıralamalarını iyileştirmek için responsive tasarım prensiplerini uygulamak gerekir. Mobil uyumluluk, içeriğinizin daha geniş bir kitleye ulaşmasını ve daha iyi performans göstermesini sağlar.
Mobil uyumlu bir web sayfası oluşturmanın temel taşlarından biri CSS Medya Sorguları (Media Queries) kullanmaktır. Medya sorguları, farklı ekran boyutlarına, çözünürlüklere veya cihaz özelliklerine göre web sayfasının stilini değiştirmemize olanak tanır. Örneğin, küçük ekranlı bir telefon için farklı bir düzen, tablet için başka bir düzen ve masaüstü bilgisayar için bambaşka bir düzen tanımlayabiliriz. Bu sayede, içerik her cihazda en iyi şekilde görünür.
<style>
/* Temel stil tanımlamaları - Masaüstü varsayılanı */
body {
font-family: Arial, sans-serif;
line-height: 1.6;
color: #333;
margin: 0;
padding: 0;
}
.container {
width: 80%;
max-width: 1200px;
margin: 20px auto;
padding: 20px;
background-color: #f9f9f9;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
h2 {
color: #0056b3;
border-bottom: 2px solid #eee;
padding-bottom: 10px;
}
p {
margin-bottom: 1em;
}
/* Mobil cihazlar için medya sorgusu */
/* Ekran genişliği 768 piksel ve altı olduğunda uygulanacak stiller */
@media (max-width: 768px) {
.container {
width: 95%; /* Daha dar ekranlarda daha geniş */
margin: 10px auto;
padding: 15px;
}
h2 {
font-size: 1.5em; /* Mobil için başlık boyutunu küçültme */
padding-bottom: 5px;
}
p, ul, ol, table {
font-size: 0.95em; /* Mobil için metin boyutunu küçültme */
}
/* Örnek: Eğer iki sütunlu bir düzen varsa, mobil cihazlarda sütunları alt alta yığma */
.two-column-layout {
flex-direction: column;
}
}
/* Çok küçük cihazlar (telefonlar) için medya sorgusu */
/* Ekran genişliği 480 piksel ve altı olduğunda uygulanacak stiller */
@media (max-width: 480px) {
.container {
padding: 10px;
}
h2 {
font-size: 1.3em;
}
p, ul, ol, table {
font-size: 0.9em;
}
}
</style>
<div class="container">
<h2>Mobil Uyumlu İçerik Örneği</h2>
<p>Bu blok, farklı ekran boyutlarında nasıl adapte olduğunu göstermek için tasarlanmıştır. Tarayıcınızın pencere boyutunu değiştirerek veya geliştirici araçlarındaki mobil görünümü kullanarak bu adaptasyonu gözlemleyebilirsiniz.</p>
<p>Mobil uyumluluk, SEO için de kritik bir faktördür. Google gibi arama motorları, mobil dostu siteleri sıralamada önceliklendirir.</p>
</div>
Yukarıdaki örnekte, .container ve h2, p gibi temel HTML elementlerinin farklı ekran genişliklerinde nasıl farklı stiller alabileceği gösterilmiştir. İlk olarak genel (masaüstü) stiller tanımlanır, ardından @media kuralları ile belirli ekran boyutları için bu stiller geçersiz kılınır veya yeni stiller eklenir. Bu, web sitenizin veya makalenizin farklı cihazlarda tutarlı, okunabilir ve kullanıcı dostu olmasını sağlar.
Python’da liste birleştirme tekniklerini öğrenmek kadar, bu teknikleri sunacağınız platformun da modern standartlara uygun olması önemlidir. Unutmayın, iyi bir içerik kadar, iyi bir sunum da okuyucu kitlenizi artırır ve bilginin daha etkili yayılmasını sağlar.
Sonuç: Hangi Yöntem Ne Zaman Kullanılmalı?
Python’da listeleri birleştirmek için birden fazla güçlü ve esnek yöntem olduğunu gördük. Her birinin kendine özgü avantajları ve dezavantajları bulunmaktadır. Doğru yöntemi seçmek, sadece kodunuzun doğruluğunu değil, aynı zamanda performansını, bellek verimliliğini ve okunabilirliğini de doğrudan etkileyecektir. İşte özetle, hangi yöntemin hangi senaryoda daha uygun olduğuna dair hızlı bir rehber:
+Operatörü: Kısa, sabit sayıda listeyi birleştirmek için en basit ve okunabilir yöntemdir. Özellikle iki veya üç küçük listeyi birleştirirken tercih edilebilir. Ancak, büyük listelerde veya bir döngü içinde kullanıldığında performans sorunları yaratabilir.extend()Metodu: Mevcut bir listeyi başka bir yinelenebilir nesnenin elemanlarıyla yerinde (in-place) genişletmek istediğinizde en verimli çözümdür. Özellikle bir döngü içinde listeye eleman eklerken veya yeni bir liste oluşturma maliyetinden kaçınmak istediğinizde idealdir.- Liste Anlayışları (List Comprehensions): İç içe geçmiş listeleri düzleştirmek (flattening) veya birleştirme işlemi sırasında elemanlara koşullu filtreleme/dönüştürme uygulamak istediğinizde oldukça esnek ve güçlüdür. Kodun okunabilirliğini artırır.
itertools.chain(): Çok sayıda veya çok büyük listeleri birleştirirken bellek verimliliği ve performans kritikse, bu yöntem rakipsizdir. Elemanları tembel (lazy) olarak yükleyerek, tüm listeyi belleğe aynı anda almak zorunda kalmazsınız. Genellikle bir yineleyici döndürür ve eğer liste olarak ihtiyacınız varsalist()ile dönüştürmeniz gerekir.- Yıldız İşareti (
*) ile Argüman Açma (Unpacking): Modern Python kodunda listeleri birleştirmenin oldukça şık ve okunabilir bir yoludur.+operatörüne benzer sonuçlar verir ancak birden fazla listeyi birleştirmek için daha esnek bir söz dizimi sunar. Küçük ve orta boyutlu listeler için+operatörüne iyi bir alternatiftir.
Unutmayın, “en iyi” yöntem genellikle bağlama bağlıdır. Uygulamanızın gereksinimlerini (performans, bellek, okunabilirlik) göz önünde bulundurarak bilinçli bir seçim yapmak, daha sağlam ve verimli Python kodları yazmanızı sağlayacaktır. Bu rehber, farklı senaryolarda doğru aracı seçmenize yardımcı olmayı amaçlamaktadır.
Sıkça Sorulan Sorular
-
Hangi yöntem en hızlıdır?
Genel olarak, mevcut bir listeyi genişletmek için
extend()en hızlı yöntemlerden biridir çünkü yeni bir liste oluşturma maliyeti yoktur. Birden fazla büyük listeyi birleştirirken ve bellek verimliliği kritik olduğunda iseitertools.chain()genellikle en iyi performansı sunar, çünkü yeni bir liste oluşturana kadar elemanları belleğe yüklemez, bu da büyük veri setleri için idealdir. -
Listeleri birleştirmek ve listeleri iç içe geçirmek arasındaki fark nedir?
Listeleri birleştirmek, iki veya daha fazla listenin elemanlarını alıp tek bir düz (flat) listeye dönüştürmektir. Örneğin,
[1,2] + [3,4]sonucu[1,2,3,4]olur. Listeleri iç içe geçirmek ise, bir listeyi başka bir listenin elemanı olarak eklemektir. Örneğin,liste1 = [1,2]veliste2 = [3,4]içinliste1.append(liste2)işlemi[1,2,[3,4]]sonucunu verir. Bu iki işlem farklı amaçlara hizmet eder ve farklı veri yapıları oluşturur. -
Farklı veri tipleri içeren listeler birleştirilebilir mi?
Evet, Python listeleri farklı veri tiplerini aynı anda barındırabilir (heterojen yapıdadır). Dolayısıyla,
[1, 'elma']ve[True, 3.14]gibi listeleri+operatörü,extend()veya unpacking (*) gibi yöntemlerle birleştirdiğinizde, sonuç[1, 'elma', True, 3.14]şeklinde sorunsuz bir şekilde oluşur. -
Birleştirme işlemi orijinal listeleri değiştirir mi?
Bu, kullandığınız yönteme bağlıdır.
+operatörü, yıldız operatörü (*) ile açma ve liste anlayışları her zaman yeni bir liste döndürür ve orijinal listeleri değiştirmez. Ancak,extend()metodu, çağrıldığı listeyi (ilk listeyi) doğrudan değiştirir veNonedöndürür.itertools.chain()ise bir yineleyici döndürür ve liste oluşturana kadar herhangi bir listeyi değiştirmez. -
Çok sayıda küçük listeyi birleştirmek için en iyi yaklaşım nedir?
Eğer çok sayıda küçük listeyi birleştirmeniz gerekiyorsa ve performans kritikse,
itertools.chain()genellikle en iyi seçenektir, özellikle de sonuç listesinin tümünü belleğe aynı anda yüklemek istemiyorsanız. Eğer sonuç listesini hemen bellekte tutmak sorun değilse,[*liste1, *liste2, *liste3, ...]şeklindeki unpacking yöntemi de okunabilirlik açısından oldukça popülerdir ve küçük listelerde performansı yeterlidir. Dinamik olarak listeye eleman ekliyorsanız,extend()metodu da çok iyi bir tercihtir.