Жагсаалт дахь элемент тус бүрийн тохиолдлын тоог Python’s Counter ашиглан тоолох

Бизнес эрхэлдэг

Python-д жагсаалтын бүх элементийн тоог len() функцийг ашиглан, элемент тус бүрийн тоог (элемент тус бүрийн тохиолдлын тоог) count() аргыг ашиглан олж болно. .

Нэмж дурдахад Python стандарт номын сангийн цуглуулгын Counter анги нь тохиолдлын тооны дарааллаар элементүүдийг авах боломжтой.

Энэ хэсэгт бид дараахь зүйлийг хэлэлцэх болно

  • Элементүүдийн нийт тоог тоолно уу:len()
  • Элемент бүрийн тоог (элемент тус бүрийн тохиолдлын тоо) тоолно.count()
  • Хэрэглээ.collections.Counter
  • Элементүүдийг тохиолдох давтамжийн дарааллаар олж авна:most_common()
  • Давхардаагүй элементүүдийн тоог (төрөл) (өвөрмөц элементүүд) тоол.
  • Нөхцөлийг хангах элементүүдийн тоог тоол.

Нэмж дурдахад тодорхой жишээ болгон дараах зүйлийг жишээ кодоор тайлбарлав.

  • Мөр дэх үгийн тоог тоолно.
  • Мөр дэх тэмдэгтийн тохиолдлын тоог тоол.

Дээж нь жагсаалт боловч ижил боловсруулалтыг tuple ашиглан хийж болно.

Элементүүдийн нийт тоог тоолно уу: len()

Жагсаалт эсвэл багц дахь нийт элементийн тоог тоолохын тулд len() функцийг ашиглана уу.

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

print(len(l))
# 7

Элемент бүрийн тоог тоолох (элемент бүрийн тохиолдлын тоо): count() арга

Элемент тус бүрийн тоог (элемент тус бүрийн тохиолдлын тоо) тоолохын тулд жагсаалт, залгуур гэх мэт count() аргыг ашиглана уу.

Хэрэв элемент болгон байхгүй утгыг аргумент болгон дамжуулвал 0-г буцаана.

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

Хэрэв та элемент бүрийн тохиолдлын тоог нэг дор авахыг хүсвэл дараах цуглуулга.Counter хэрэгтэй.

Collections.Counter хэрхэн ашиглах

Python стандарт номын сангийн цуглуулга нь Counter ангитай.

Counter() нь dict төрлийн толь бичгийн дэд анги бөгөөд өгөгдөлд элемент хэлбэрээр түлхүүрүүд, тохиолдлууд нь утга хэлбэрээр байдаг.

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

Хэрэв элементийг түлхүүр болгон зааж өгсөн бол элементийн тоог авч болно. Хэрэв элемент хэлбэрээр байхгүй утгыг зааж өгсөн бол 0-г буцаана.

print(c['a'])
# 4

print(c['b'])
# 1

print(c['c'])
# 2

print(c['d'])
# 0

Та мөн keys(), values(), items() гэх мэт толь бичгийн төрлийн аргуудыг ашиглаж болно.

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)])

Эдгээр аргууд нь dict_keys гэх мэт төрлийн объектуудыг буцаадаг. Хэрэв та for мэдэгдлийг ажиллуулахыг хүсвэл тэдгээрийг ашиглаж болно. Хэрэв та үүнийг жагсаалт руу хөрвүүлэхийг хүсвэл list() ашиглана уу.

Элементүүдийг харагдах давтамжийн дарааллаар олж авах: most_common() арга

Тоолуур нь хамгийн_нийтлэг() аргатай бөгөөд энэ нь тохиолдлын тоогоор эрэмблэгдсэн маягтын багцуудын жагсаалтыг (элемент, тохиолдлын тоо) буцаадаг.

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

Хамгийн олон тохиолдлын хувьд [0], хамгийн бага тохиолдлын хувьд [-1] гэх мэт индексийг зааж өгснөөр хамгийн их тохиолдох элементийг авч болно. Хэрэв та зөвхөн элементүүдийг эсвэл зөвхөн тохиолдлын тоог авахыг хүсвэл индексийг нэмж зааж өгч болно.

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

Хэрэв та тэдгээрийг тохиолдлын тоог бууруулах дарааллаар эрэмбэлэхийг хүсвэл -1 гэж тохируулсан зүсмэлийг ашиглана уу.

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

Хэрэв most_common() аргын хувьд n аргументыг зааж өгсөн бол зөвхөн хамгийн олон тохиолдолтой n элементийг буцаана. Хэрэв үүнийг орхигдуулсан бол бүх элементүүд.

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

Хэрэв та (элемент, тохиолдлын тоо)-ын багцаас илүү тохиолдлын тоогоор эрэмблэгдсэн элементүүд/тохиолдлуудын тусдаа жагсаалтыг авахыг хүсвэл дараах байдлаар задалж болно.

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

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

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

Баригдсан функц zip() нь хоёр хэмжээст жагсаалтыг (энэ тохиолдолд, залгууруудын жагсаалт) шилжүүлж, дараа нь задалж задлахад ашиглагддаг.

Давхардаагүй элементүүдийн тоог (төрөл) (өвөрмөц элементүүд) тоол.

Жагсаалт эсвэл багцад хэр олон давхцаагүй элемент (өвөрмөц элементүүд) байгааг (хэдэн төрөл байгааг) тоолохын тулд дээр дурдсанчлан Counter эсвэл set()-г ашиглана уу.

Counter объектын элементүүдийн тоо нь len()-ээр олж авч болох анхны жагсаалтын давхцаагүй элементүүдийн тоотой тэнцүү байна.

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

print(len(c))
# 3

Та мөн олонлогийн төрлийн олонлогийн үүсгэгч set()-г ашиглаж болох бөгөөд хэрэв танд Counter объект хэрэггүй бол энэ нь илүү хялбар болно.

Багцын төрөл нь давхардсан элементгүй өгөгдлийн төрөл юм. Жагсаалтыг set()-д дамжуулах нь давхардсан утгуудыг үл тоомсорлож, зөвхөн өвөрмөц утгууд бүхий багц төрлийн объектыг элемент болгон буцаана. Энэ төрлийн элементүүдийн тоог len() ашиглан олж авна.

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

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

Нөхцөлийг хангах элементүүдийн тоог тоол.

Жагсаалт эсвэл багц дахь тодорхой нөхцөлийг хангасан элементүүдийн тоог тоолохын тулд жагсаалтын ойлголтын тэмдэглэгээ эсвэл үүсгэгчийн илэрхийллийг ашиглана уу.

Жишээ болгон дараах тоонуудын жагсаалтад сөрөг утгатай элементийн тоог тоол

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

Жагсаалтын ойлголтын тэмдэглэгээний элемент бүрт нөхцөлт илэрхийлэл хэрэглэснээр элементүүд нь Boolean bools (үнэн, худал) жагсаалт гарч ирнэ. Boolean төрлийн bool нь бүхэл тооны int төрлийн дэд анги бөгөөд үнэнийг 1, худал нь 0 гэж тооцдог. Иймд нийлбэрийг нийлбэрээр тооцоолох замаар үнэн утгын тоог (нөхцөлийг хангасан элементийн тоог) тоолж болно. ().

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

Жагсаалтын ойлголтын тэмдэглэгээн дэх []-г ()-ээр орлуулбал генераторын илэрхийлэл гарч ирнэ. Жагсаалтыг ойлгох тэмдэглэгээ нь боловсруулсан бүх элементүүдийн жагсаалтыг үүсгэдэг бол генераторын илэрхийлэл нь элементүүдийг дараалан боловсруулдаг тул санах ойг илүү хэмнэлттэй болгодог.

Генераторын илэрхийлэл нь цорын ганц аргумент байх үед ()-г орхигдуулж болох тул үүнийг сүүлчийн тохиолдол шиг бичиж болно.

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

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

Хэрэв та худал утгын тоог (нөхцөлийг хангахгүй байгаа элементүүдийн тоо) тоолохыг хүсвэл үгүйг ашиглана уу. > бусаас илүү давуу эрхтэй (энэ нь эхлээд тооцогдоно) тул дараах жишээн дэх (i < 0)-д () хаалт хийх шаардлагагүй.

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

Мэдээжийн хэрэг, нөхцөлийг өөрөө өөрчилж болно.

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

Бусад зарим жишээг доор харуулав.

Тоонуудын жагсаалтын сондгой элементийн тоог авах жишээ.

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

Мөрийн жагсаалтын нөхцлийн жишээ.

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

Тоолуурыг тохиолдлын тоогоор тоолоход ашигладаг. items() нь (элемент, тохиолдлын тоо)-ийн багцыг олж авдаг бөгөөд тохиолдлын тоо нь нөхцөлийг тодорхойлдог.

Дараах нь хоёр ба түүнээс дээш тохиолдол бүхий элементүүдийг гаргаж авах, нийт тохиолдлын тоог тоолох жишээ юм. Энэ жишээнд дөрвөн а, хоёр в, нийт зургаан байна.

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, 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

Мөр дэх үгийн тоог тоолно.

Тодорхой жишээ болгон үгийн мөрөнд тохиолдох тоог тоолъё.

Эхлээд replace() аргыг ашиглан шаардлагагүй таслал болон цэгүүдийг хоосон тэмдэгтээр сольж, дараа нь устгана уу. Дараа нь split() аргыг ашиглан зайгаар тусгаарлагдсан жагсаалт үүсгэнэ үү.

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']

Жагсаалт хийж чадвал үг бүрийн гарч ирэх тоо, гарч буй үгсийн төрлүүд, цуглуулгуудын хамгийн_нийтлэг()-ийг авах боломжтой. Хамгийн олон удаа гарч ирэх үгийг авахын тулд тоолуур.

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

Дээрх нь маш энгийн процесс тул NLTK гэх мэт номын сангуудыг байгалийн хэлээр илүү нарийн боловсруулахад ашиглах нь дээр.

Мөн Япон хэл дээрх текстийн хувьд split()-г ашиглан текстийг хуваах боломжгүй, учир нь тодорхой үг салгах зүйл байхгүй. Жишээлбэл, та үүнд хүрэхийн тулд Janome номын санг ашиглаж болно.

Мөр дэх тэмдэгтийн тохиолдлын тоог тоол.

Мөрүүд нь бас дарааллын төрөл байдаг тул тэдгээрийг count() аргаар ашиглах эсвэл коллекцийн үүсгэгч рүү аргумент болгон дамжуулж болно.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})

Хамгийн их тохиолддог 5 тэмдэгтийг сэргээх жишээ.

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')