Python Sayğacı ilə siyahıda hər bir elementin baş vermə sayının hesablanması

Biznes

Python-da siyahı və ya dəstdəki bütün elementlərin sayını daxili funksiyadan istifadə etməklə əldə etmək olar len() və hər bir elementin sayını (hər elementin baş vermə sayı) count() metodundan istifadə etməklə əldə etmək olar. .

Bundan əlavə, elementləri hadisələrin sayına görə almaq üçün Python standart kitabxana kolleksiyalarının Counter sinfindən istifadə etmək olar.

Bu bölmədə biz aşağıdakıları müzakirə edəcəyik

  • Elementlərin ümumi sayını hesablayın:len()
  • Hər bir elementin sayını hesablayın (hər bir elementin baş vermə sayı):count()
  • İstifadəsi.collections.Counter
  • Elementlər baş vermə tezliyi sırasına görə alınır:most_common()
  • Üst-üstə düşməyən elementlərin (unikal elementlərin) sayını (növünü) sayın.
  • Şərti ödəyən elementlərin sayını sayın.

Bundan əlavə, konkret bir nümunə olaraq, aşağıdakı nümunə kodla izah olunur.

  • Sətirdə sözün təkrarlanma sayını hesablayır.
  • Bir sətirdə simvolun baş vermə sayını sayın.

Nümunə siyahıdır, lakin eyni emal tuplelərlə edilə bilər.

Elementlərin ümumi sayını hesablayın: len()

Siyahı və ya dəstdəki elementlərin ümumi sayını hesablamaq üçün len() daxili funksiyasından istifadə edin.

l = ['a', 'a', 'a', 'a', 'b', 'c', 'c']

print(len(l))
# 7

Hər bir elementin sayının hesablanması (hər bir elementin baş vermə sayı): count() metodu

Hər bir elementin sayını (hər bir elementin baş vermə sayı) hesablamaq üçün siyahılar, dəstlər və s. üçün count() metodundan istifadə edin.

Element kimi mövcud olmayan dəyər arqument kimi ötürülürsə, 0 qaytarılır.

l = ['a', 'a', 'a', 'a', 'b', 'c', 'c']

print(l.count('a'))
# 4

print(l.count('b'))
# 1

print(l.count('c'))
# 2

print(l.count('d'))
# 0

Hər bir elementin baş vermə sayını bir anda əldə etmək istəyirsinizsə, aşağıdakı kolleksiya faydalıdır.Counter.

Collections.Counter necə istifadə olunur

Python standart kitabxana kolleksiyalarında Counter sinfi var.

Counter() açar kimi elementlər, qiymətlər isə hadisələr şəklində verilənlərə malik olan dict lüğət tipli alt sinifdir.

import collections

l = ['a', 'a', 'a', 'a', 'b', 'c', 'c']

c = collections.Counter(l)
print(c)
# Counter({'a': 4, 'c': 2, 'b': 1})

print(type(c))
# <class 'collections.Counter'>

print(issubclass(type(c), dict))
# True

Əgər element açar kimi göstərilibsə, elementlərin sayını əldə etmək olar. Element olaraq mövcud olmayan bir dəyər göstərilərsə, 0 qaytarılır.

print(c['a'])
# 4

print(c['b'])
# 1

print(c['c'])
# 2

print(c['d'])
# 0

Siz həmçinin keys(), values(), items() kimi lüğət tipli üsullardan istifadə edə bilərsiniz.

print(c.keys())
# dict_keys(['a', 'b', 'c'])

print(c.values())
# dict_values([4, 1, 2])

print(c.items())
# dict_items([('a', 4), ('b', 1), ('c', 2)])

Bu üsullar dict_keys və s. tipli obyektləri qaytarır. Onlardan for ifadəsini işlətmək istədiyiniz kimi istifadə oluna bilər. Əgər onu siyahıya çevirmək istəyirsinizsə, list() funksiyasından istifadə edin.

Görünüş tezliyinə görə elementlərin alınması: most_common() metodu

Sayğac ən çox_ümumən() metoduna malikdir, o, baş verənlərin sayına görə çeşidlənmiş forma dəstlərinin siyahısını (element, baş verənlərin sayı) qaytarır.

print(c.most_common())
# [('a', 4), ('c', 2), ('b', 1)]

Ən çox rast gəlinən elementi indeks təyin etməklə əldə etmək olar, məsələn, ən çox rast gəlinmə sayı üçün [0] və ən az rast gəlinmə sayı üçün [-1]. Yalnız elementləri və ya yalnız baş verənlərin sayını əldə etmək istəyirsinizsə, indeksi əlavə olaraq təyin edə bilərsiniz.

print(c.most_common()[0])
# ('a', 4)

print(c.most_common()[-1])
# ('b', 1)

print(c.most_common()[0][0])
# a

print(c.most_common()[0][1])
# 4

Əgər siz onları hadisələrin sayının azalması sırasına görə çeşidləmək istəyirsinizsə, artımı -1 olaraq təyin edilmiş dilimdən istifadə edin.

print(c.most_common()[::-1])
# [('b', 1), ('c', 2), ('a', 4)]

Əgər n arqumenti most_common() metodu üçün göstərilibsə, yalnız ən çox rast gəlinən n element qaytarılır. Əgər buraxılıbsa, bütün elementlər.

print(c.most_common(2))
# [('a', 4), ('c', 2)]

Əgər (element, baş vermə sayı) dəstindən deyil, hadisələrin sayına görə sıralanmış elementlərin/hadisələrin ayrıca siyahısını istəyirsinizsə, onu aşağıdakı kimi parçalaya bilərsiniz.

values, counts = zip(*c.most_common())

print(values)
# ('a', 'c', 'b')

print(counts)
# (4, 2, 1)

Daxili funksiya zip() ikiölçülü siyahının yerini dəyişdirmək üçün istifadə olunur (bu halda, tuples siyahısı) və sonra onu çıxarın və çıxarın.

Üst-üstə düşməyən elementlərin (unikal elementlərin) sayını (növünü) sayın.

Siyahıda və ya dəstdə neçə üst-üstə düşməyən elementlərin (unikal elementlərin) olduğunu (neçə növ var) hesablamaq üçün yuxarıda təsvir olunduğu kimi Counter və ya set() funksiyasından istifadə edin.

Counter obyektindəki elementlərin sayı orijinal siyahıdakı üst-üstə düşməyən elementlərin sayına bərabərdir və bu elementləri len() ilə əldə etmək olar.

l = ['a', 'a', 'a', 'a', 'b', 'c', 'c']
c = collections.Counter(l)

print(len(c))
# 3

Siz həmçinin dəst növü dəsti üçün konstruktor olan set() funksiyasından istifadə edə bilərsiniz, bu isə Sayğac obyektinə ehtiyacınız olmadıqda daha asandır.

Dəst növü dublikat elementləri olmayan məlumat növüdür. Siyahının set() funksiyasına keçməsi dublikat dəyərlərə məhəl qoymur və elementlər kimi yalnız unikal dəyərləri olan dəst tipli obyekti qaytarır. Bu tip elementlərin sayı len() vasitəsilə əldə edilir.

print(set(l))
# {'a', 'c', 'b'}

print(len(set(l)))
# 3

Şərti ödəyən elementlərin sayını sayın.

Müəyyən şərti ödəyən siyahı və ya dəstdə elementlərin sayını hesablamaq üçün siyahı başa düşmə notasiyasından və ya generator ifadələrindən istifadə edin.

Nümunə olaraq, aşağıdakı nömrələr siyahısı üçün mənfi dəyərləri olan elementlərin sayını sayın

l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

Siyahının başa düşülməsi qeydində hər bir elementə şərti ifadənin tətbiqi elementləri Boolean bools (doğru, yanlış) olan siyahı verir. Boolean tipli bool int tam tipli alt sinifdir, burada true 1, yalan isə 0 kimi qəbul edilir. Buna görə də həqiqi dəyərlərin sayını (şərti təmin edən elementlərin sayı) cəmindən istifadə edərək cəmi hesablamaqla hesablamaq olar. ().

print([i < 0 for i in l])
# [True, True, True, True, True, False, False, False, False, False, False]

print(sum([i < 0 for i in l]))
# 5

Siyahının başa düşülməsi qeydində [] işarəsini () ilə əvəz etsək, generator ifadəsi alırıq. Siyahının başa düşülməsi qeydi işlənmiş bütün elementlərin siyahısını yaradır, generator ifadəsi isə elementləri ardıcıllıqla emal edir və buna görə də yaddaşda daha səmərəli olur.

Generator ifadəsi yeganə arqument olduqda, () buraxıla bilər, ona görə də sonuncu halda olduğu kimi yazıla bilər.

print(sum((i < 0 for i in l)))
# 5

print(sum(i < 0 for i in l))
# 5

Yanlış qiymətlərin sayını (şərti təmin etməyən elementlərin sayını) hesablamaq istəyirsinizsə, istifadə etmə. Qeyd edək ki, > olmayandan daha yüksək üstünlüyə malikdir (əvvəlcə hesablanır), ona görə də aşağıdakı misalda (i < 0) mötərizələri () lazım deyil.

print([not (i < 0) for i in l])
# [False, False, False, False, False, True, True, True, True, True, True]

print(sum(not (i < 0) for i in l))
# 6

Təbii ki, şərtlərin özləri də dəyişdirilə bilər.

print(sum(i >= 0 for i in l))
# 6

Bəzi digər nümunələr aşağıda göstərilmişdir.

Rəqəmlər siyahısı üçün tək elementlərin sayını əldə etmək nümunəsi.

print([i % 2 == 1 for i in l])
# [True, False, True, False, True, False, True, False, True, False, True]

print(sum(i % 2 == 1 for i in l))
# 6

Sətirlərin siyahısı üçün şərt nümunəsi.

l = ['apple', 'orange', 'banana']

print([s.endswith('e') for s in l])
# [True, True, False]

print(sum(s.endswith('e') for s in l))
# 2

Sayğac hadisələrin sayına görə saymaq üçün istifadə olunur. items() bir dəst əldə edir (element, baş verənlərin sayı) və baş verənlərin sayı şərti müəyyənləşdirir.

Aşağıda iki və ya daha çox rast gəlinən elementlərin çıxarılması və baş verənlərin ümumi sayının hesablanması nümunəsidir. Bu misalda, cəmi altı olmaqla, dörd a və iki c var.

l = ['a', 'a', 'a', 'a', 'b', 'c', 'c']
c = collections.Counter(l)

print(c.items())
# dict_items([('a', 4), ('b', 1), ('c', 2)])

print([i for i in l if c[i] >= 2])
# ['a', 'a', 'a', 'a', 'c', 'c']

print([i[1] for i in c.items() if i[1] >= 2])
# [4, 2]

print(sum(i[1] for i in c.items() if i[1] >= 2))
# 6

Aşağıda iki və ya daha çox rast gəlinən elementlərin növlərinin çıxarılması və baş verənlərin sayının hesablanması nümunəsidir. Bu nümunədə iki növ var, a və c.

print([i[0] for i in c.items() if i[1] >= 2])
# ['a', 'c']

print([i[1] >= 2 for i in c.items()])
# [True, False, True]

print(sum(i[1] >= 2 for i in c.items()))
# 2

Sətirdə sözün təkrarlanma sayını hesablayır.

Konkret misal olaraq, bir sətirdə sözün baş vermə sayını hesablayaq.

Əvvəlcə əvəz() metodundan istifadə edərək lazımsız vergül və nöqtələri boş sətirlə əvəz edin və sonra silin. Sonra, boşluqlarla ayrılmış siyahı yaratmaq üçün split() metodundan istifadə edin.

s = 'government of the people, by the people, for the people.'

s_remove = s.replace(',', '').replace('.', '')

print(s_remove)
# government of the people by the people for the people

word_list = s_remove.split()

print(word_list)
# ['government', 'of', 'the', 'people', 'by', 'the', 'people', 'for', 'the', 'people']

Siyahı yarada bilsəniz, hər sözün görünmə sayını, görünən sözlərin növlərini və kolleksiyaların ən çox_ümumən() sayını əldə edə bilərsiniz. Ən çox görünən sözü əldə etmək üçün Counter.

print(word_list.count('people'))
# 3

print(len(set(word_list)))
# 6

c = collections.Counter(word_list)

print(c)
# Counter({'the': 3, 'people': 3, 'government': 1, 'of': 1, 'by': 1, 'for': 1})

print(c.most_common()[0][0])
# the

Yuxarıda göstərilənlər çox sadə bir prosesdir, ona görə də daha mürəkkəb təbii dilin işlənməsi üçün NLTK kimi kitabxanalardan istifadə etmək daha yaxşıdır.

Həmçinin, Yapon mətni vəziyyətində, split() mətni bölmək üçün istifadə edilə bilməz, çünki aydın söz ayırma yoxdur. Məsələn, buna nail olmaq üçün Janome kitabxanasından istifadə edə bilərsiniz.

Bir sətirdə simvolun baş vermə sayını sayın.

Sətirlər də ardıcıllıq növü olduğundan, onlar count() metodu ilə istifadə oluna və ya kolleksiyaların konstruktoruna arqument kimi ötürülə bilər.Counter().

s = 'supercalifragilisticexpialidocious'

print(s.count('p'))
# 2

c = collections.Counter(s)

print(c)
# Counter({'i': 7, 's': 3, 'c': 3, 'a': 3, 'l': 3, 'u': 2, 'p': 2, 'e': 2, 'r': 2, 'o': 2, 'f': 1, 'g': 1, 't': 1, 'x': 1, 'd': 1})

Ən çox rast gəlinən ilk 5 simvolun əldə edilməsi nümunəsi.

print(c.most_common(5))
# [('i', 7), ('s', 3), ('c', 3), ('a', 3), ('l', 3)]

values, counts = zip(*c.most_common(5))

print(values)
# ('i', 's', 'c', 'a', 'l')