koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da bir öğenin listede kaç tane olduğu nasıl sayılır?

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.

Bir yanıt yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top