Bir listede yinelenen öğeler olup olmadığını kontrol eden ve varsa bunları kaldıran ve yinelenmeyen / kaldırılmayan öğeleri içeren yeni bir liste döndüren bir program yazmam gerekiyor. Elimdeki şey bu ama dürüst olmak gerekirse ne yapacağımı bilmiyorum.
def remove_duplicates():
t = ['a', 'b', 'c', 'd']
t2 = ['a', 'c', 'd']
for t in t2:
t.append(t.remove())
return t
Benzersiz bir öğe koleksiyonu elde etmek için yaygın yaklaşım bir set
kullanmaktır. Kümeler ayrı nesnelerden oluşan sırasız koleksiyonlardır. Herhangi bir yinelenebilir dosyadan bir set oluşturmak için, bu dosyayı yerleşik set()
işlevine aktarabilirsiniz. Daha sonra tekrar gerçek bir listeye ihtiyacınız olursa, benzer şekilde kümeyi list()
fonksiyonuna aktarabilirsiniz.
Aşağıdaki örnek, yapmaya çalıştığınız şeyi kapsamalıdır:
>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> t
[1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> list(set(t))
[1, 2, 3, 5, 6, 7, 8]
>>> s = [1, 2, 3]
>>> list(set(t) - set(s))
[8, 5, 6, 7]
Örnek sonuçtan da görebileceğiniz gibi, orijinal düzen korunmaz. Yukarıda belirtildiği gibi, kümelerin kendileri sırasız koleksiyonlardır, bu nedenle sıralama kaybolur. Bir kümeyi tekrar listeye dönüştürürken, rastgele bir sıra oluşturulur.
Eğer düzen sizin için önemliyse, o zaman farklı bir mekanizma kullanmanız gerekecektir. Bunun için çok yaygın bir çözüm, ekleme sırasında anahtarların sırasını korumak için OrderedDict
'e güvenmektir:
>>> from collections import OrderedDict
>>> list(OrderedDict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]
Python 3.7 ile başlayarak, yerleşik sözlüğün ekleme sırasını da koruyacağı garanti edilir, bu nedenle Python 3.7 veya daha yenisini (veya CPython 3.6) kullanıyorsanız bunu doğrudan da kullanabilirsiniz:
>>> list(dict.fromkeys(t))
[1, 2, 3, 5, 6, 7, 8]
Bunun, önce bir sözlük oluşturmanın ve ardından ondan bir liste oluşturmanın ek yüküne sahip olduğunu unutmayın. Sırayı korumanız gerekmiyorsa, bir küme kullanmanız daha iyi olur. Daha fazla ayrıntı ve kopyaları kaldırırken sırayı korumanın alternatif yolları için bu soruya göz atın.
Son olarak, hem set
hem de OrderedDict
/dict
çözümlerinin öğelerinizin hash edilebilir olmasını gerektirdiğini unutmayın. Bu genellikle değişmez olmaları gerektiği anlamına gelir. Eğer hashlenebilir olmayan öğelerle (örneğin liste nesneleri) uğraşmak zorundaysanız, o zaman temelde her öğeyi iç içe geçmiş bir döngüde diğer tüm öğelerle karşılaştırmak zorunda kalacağınız yavaş bir yaklaşım kullanmanız gerekecektir.
Tek satırlık bir işlemdir: list(set(source_list))
işinizi görecektir.
Bir `set', muhtemelen kopyaları olamayacak bir şeydir.
Güncelleme: Düzeni koruyan bir yaklaşım iki satırdır:
from collections import OrderedDict
OrderedDict((x, True) for x in source_list).keys()
Burada OrderedDict
in anahtarların yerleştirme sırasını hatırladığı ve belirli bir anahtardaki değer güncellendiğinde bunu değiştirmediği gerçeğini kullanıyoruz. Değer olarak True
ekliyoruz, ancak herhangi bir şey ekleyebiliriz, değerler sadece kullanılmaz. (set
de yok sayılan değerlere sahip bir dict
gibi çalışır).