Bir listemiz olduğunu varsayalım. Bu listede istediğimiz bir elemanın kaç kere bulunduğunu nasıl sayabiliriz?
Listedeki bir öğenin tekrarlarını sayma
Tek bir öğenin tekrarlarını saymak için: count()
>>> l = ["a","b","b"]
>>> l.count("a")
1
>>> l.count("b")
2
Listedeki tüm öğelerin tekrarlarını saymak, listeyi “saymak” veya bir çetele sayacı oluşturmak olarak da bilinir.
Tüm öğeleri count() ile sayma
Öğelerin tekrarlarını saymak için bir liste üzerinden döngü kurabiliriz:
[[x,l.count(x)] for x in set(l)]
(veya benzer şekilde bir sözlükle dict((x,l.count(x)) for x in set(l))
)
Örnek:
>>> l = ["a","b","b"]
>>> [[x,l.count(x)] for x in set(l)]
[['a', 1], ['b', 2]]
>>> dict((x,l.count(x)) for x in set(l))
{'a': 1, 'b': 2}
Counter() ile tüm öğeleri sayma
Alternatif olarak, collections
kütüphanesinde daha hızlı bir çözüm bulunur:
Counter(l)
Örnek:
>>> l = ["a","b","b"]
>>> from collections import Counter
>>> Counter(l)
Counter({'b': 2, 'a': 1})
Counter ne kadar hızlı?
İki liste için yineleme yöntemini ve Counter()’ın hızlarını kontrol edelim. Her iki yöntemi de birkaç değerle deneyelim:
from __future__ import print_function
import timeit
t1=timeit.Timer('Counter(l)', \
'import random;import string;from collections import Counter;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
)
t2=timeit.Timer('[[x,l.count(x)] for x in set(l)]',
'import random;import string;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
)
print("Counter(): ", t1.repeat(repeat=3,number=10000))
print("count(): ", t2.repeat(repeat=3,number=10000)
Ve çıktı:
Counter(): [0.46062711701961234, 0.4022796869976446, 0.3974247490405105]
count(): [7.779430688009597, 7.962715800967999, 8.420845870045014]
Görüldüğü gibi Counter() oldukça hızlı. Hatta bu hız daha büyük listelerde daha belirgin hale gelecektir. Yineleme metodu O(n^2) ile çalışırken Counter O(n) ile çalışır.