Aşağıda, aşağıdaki durumların her biri için Python’da bir listenin (dizinin) yinelenen öğeleri (tüm öğeler benzersiz/benzersizdir) olup olmadığının nasıl belirleneceği açıklanmaktadır.
- Öğede listesi olmayan bir liste için
- Öğe listeleri içeren listeler için (iki boyutlu diziler, liste listeleri vb.)
Bir listeden yinelenen öğelerin nasıl kaldırılacağı veya çıkarılacağı ile ilgili aşağıdaki makaleye bakın.
Listelerin farklı veri türlerini depolayabileceğini ve dizilerden kesinlikle farklı olduğunu unutmayın. Bellek boyutu ve bellek adresleri veya büyük verilerin sayısal olarak işlenmesini gerektiren işlemlerde dizileri işlemek istiyorsanız dizi (standart kitaplık) veya NumPy kullanın.
Listede yinelenen öğeler olup olmadığını belirleyin (öğenin listesi yoksa)
Öğenin liste gibi güncellenebilir bir nesnesi yoksa, set set tipinin set() yapıcısını kullanın.
Küme türü, yinelenen öğeleri olmayan bir veri türüdür. Set() yapıcısına bir liste iletildiğinde, yinelenen değerler yok sayılır ve öğe olarak yalnızca benzersiz değerlere sahip bir tür kümesi nesnesi döndürülür.
Bu küme tipi nesnesindeki öğelerin sayısı ve orijinal liste, yerleşik len() işlevi kullanılarak elde edilir ve karşılaştırılır.
- Öğe sayısı eşitse, orijinal listede yinelenen öğe yoktur.
- Öğe sayısı farklıysa, yinelenen öğeler orijinal listeye dahil edilir
Yinelenen öğe yoksa false, yinelenen öğeler varsa true döndüren işlevler aşağıdaki gibidir.
def has_duplicates(seq):
return len(seq) != len(set(seq))
l = [0, 1, 2]
print(has_duplicates(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates(l))
# True
Örnek bir listedir, ancak aynı işlev tanımlama grupları ile kullanılabilir.
Listeler gibi değişebilir (güncellenebilir) nesneler, tür kümesinin öğeleri olamaz. Bu nedenle, öğe olarak listeler içeren listeler (iki boyutlu diziler, liste listeleri vb.) TypeError ile sonuçlanacaktır. Karşı önlem aşağıda gösterilmiştir.
l_2d = [[0, 1], [1, 1], [0, 1], [1, 0]]
# print(has_duplicates(l_2d))
# TypeError: unhashable type: 'list'
Listede yinelenen öğeler olup olmadığını belirleyin (öğenin bir listesi varsa)
Öğe listesi içeren bir liste durumunda (liste listesi gibi), yinelenen öğelerin olup olmadığını belirlemek için aşağıdaki işlevler kullanılabilir.
def has_duplicates2(seq):
seen = []
unique_list = [x for x in seq if x not in seen and not seen.append(x)]
return len(seq) != len(unique_list)
l_2d = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(l_2d))
# False
l_2d = [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(l_2d))
# True
set() yerine, liste anlama gösterimi, öğeleri yalnızca benzersiz değerler olan bir liste oluşturur ve öğelerin sayısı karşılaştırılır. Ayrıntılar için aşağıdaki makaleye bakın.
Bu fonksiyon, eleman listesi olmayan listeler için de geçerlidir.
l = [0, 1, 2]
print(has_duplicates2(l))
# False
l = [0, 1, 1, 2]
print(has_duplicates2(l))
# True
Şimdiye kadarki örnek, öğe listesinin kopyalanıp kopyalanmadığının belirlenmesidir (aynı listeyi içerir).
Her bir listenin öğelerinin örtüşüp örtüşmediği, orijinal liste bir boyuta düzleştirildikten sonra belirlenebilir.
l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]
print(has_duplicates(sum(l_2d, [])))
# False
l_2d = [[0, 1], [2, 0]]
print(has_duplicates(sum(l_2d, [])))
# True
Burada, listeyi düzleştirmek için sum() kullanılır, ancak itertools.chain.from_iterable() da kullanılabilir. Ayrıca, üç veya daha fazla boyutlu bir listeyi düzleştirirken yeni bir fonksiyon tanımlamak gerekir.