У цьому підручнику ви дізнаєтесь, як використовувати об’єкт лічильника з модуля колекції Python.
Коли ви працюєте з довгими послідовностями в Python, скажімо, зі списками або рядками Python, іноді вам може знадобитися зберегти елементи, які з’являються в послідовності, і кількість разів, коли вони з’являються.
Словник Python є відповідною вбудованою структурою даних для таких програм. Однак клас лічильника Python із модуля колекцій може спростити це, побудувавши лічильник, який є словником елементів та їхньої кількості в послідовності.
Протягом наступних кількох хвилин ви дізнаєтесь про таке:
- Використовуйте об’єкт лічильника Python
- Створіть словник Python для зберігання значень підрахунку елементів у ітерації
- Перепишіть словник за допомогою лічильника Python із спрощеним синтаксисом
- Виконуйте такі операції, як оновлення та віднімання елементів, пошук перетину між двома зустрічними об’єктами
- Отримайте найбільш часті елементи в лічильнику за допомогою методу most_common().
Давайте розпочнемо!
Модуль колекцій Python і клас лічильника
Ви часто використовуєте словник Python, щоб зберігати елементи та їхню кількість у ітерації. Елементи та кількість зберігаються як ключі та значення відповідно.
Оскільки клас Counter є частиною вбудованого модуля колекцій Python, ви можете імпортувати його у свій сценарій Python так:
from collections import Counter
Після імпортування класу Counter, як зазначено, ви можете створити екземпляр об’єкта лічильника, як показано:
<counter_object> = Counter(iterable)
Тут:
- iterable — це будь-який дійсний ітерований Python, наприклад список, рядок або кортеж Python.
- Елементи в iterable мають бути хешованими.
Тепер, коли ми знаємо, як використовувати Counter для створення об’єктів лічильника з будь-якого ітерованого Python, давайте почнемо кодувати.
Приклади, використані в цьому посібнику, можна знайти в цій суті GitHub.
Як створити об’єкт лічильника з Python Iterables
Давайте створимо рядок Python, скажімо, «ренесанс» і назвемо його словом.
>>> word = "renaissance"
Наша мета — створити словник, де кожна літера в рядку слів зіставляється з кількістю разів, коли вона зустрічається в рядку. Одним із підходів є використання циклів for, як показано:
>>> letter_count = {} >>> for letter in word: ... if letter not in letter_count: ... letter_count[letter] = 0 ... letter_count[letter] += 1 ... >>> letter_count {'r': 1, 'e': 2, 'n': 2, 'a': 2, 'i': 1, 's': 2, 'c': 1}
Давайте розберемо, що робить наведений вище фрагмент коду:
- Ініціалізує letter_count порожнім словником Python.
- Перебирає рядок слів.
- Перевіряє наявність літери в словнику letter_count.
- Якщо літера відсутня, вона додає її зі значенням 0 і згодом збільшує значення на 1.
- Для кожного входження букви в слово значення, відповідне літері, збільшується на 1.
- Це продовжується до тих пір, поки ми не пройдемо весь рядок.
Ми самостійно створили словник letter_count, використовуючи цикл for для проходження рядкового слова.
Тепер давайте використаємо клас Counter із модуля collections. Нам потрібно лише передати рядок слова в Counter(), щоб отримати letter_count без необхідності повторювати ітерації.
>>> from collections import Counter >>> letter_count = Counter(word) >>> letter_count Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1})
Лічильник також є словником Python. Ми можемо використати вбудовану функцію isinstance(), щоб перевірити це:
>>> isinstance(letter_count,dict) True
Як видно, isinstance(letter_count, dict) повертає True, вказуючи, що об’єкт лічильника letter_count є екземпляром класу dict Python.
Зміна об’єкта лічильника
Поки що ми навчилися створювати об’єкти-лічильники з рядків Python.
Ви також можете змінювати об’єкти лічильників, оновлюючи їх елементами з іншого ітерованого елемента або віднімаючи з них інший ітерований об’єкт.
Оновлення лічильника з елементами з іншого ітерованого
Давайте ініціалізуємо інший рядок another_word:
>>> another_word = "effervescence"
Припустімо, ми хочемо оновити об’єкт лічильника letter_count елементами з рядка another_word.
Ми можемо використовувати метод update() для об’єкта лічильника letter_count.
>>> letter_count.update(another_word) >>> letter_count Counter({'e': 7, 'n': 3, 's': 3, 'c': 3, 'r': 2, 'a': 2, 'f': 2, 'i': 1, 'v': 1})
У вихідних даних ми бачимо, що об’єкт лічильника було оновлено, щоб також включити літери та їх кількість входжень з another_word.
Віднімання елементів з іншого ітерованого
Тепер давайте віднімемо значення another_word від об’єкта letter_count. Для цього ми можемо використати метод subtract(). Використання
Давайте віднімемо another_word від letter_count.
>>> letter_count.subtract(another_word) >>> letter_count Counter({'e': 2, 'n': 2, 'a': 2, 's': 2, 'r': 1, 'i': 1, 'c': 1, 'f': 0, 'v': 0})
Ми бачимо, що значення, які відповідають буквам у another_word, було віднято, але додані ключі «f» і «v» не видалено. Тепер вони зіставляються зі значенням 0.
Примітка: тут ми передали another_word, рядок Python, до виклику методу subtract(). Ми також можемо передати об’єкт лічильника Python або інший ітерований об’єкт.
Перетин між двома об’єктами-лічильниками в Python
Іноді вам може знадобитися знайти перетин між двома об’єктами лічильника Python, щоб визначити, які ключі є спільними між ними.
Давайте створимо об’єкт-лічильник, скажімо, letter_count_2, із рядка another_word «шипіння».
>>> another_word = "effervescence" >>> letter_count_2 = Counter(another_word) >>> letter_count_2 Counter({'e': 5, 'f': 2, 'c': 2, 'r': 1, 'v': 1, 's': 1, 'n': 1})
Ми можемо використовувати простий оператор &, щоб знайти перетин між letter_count і letter_count_2.
>>> letter_count & letter_count_2 Counter({'e': 2, 'r': 1, 'n': 1, 's': 1, 'c': 1})
Зверніть увагу на те, як ви отримуєте ключі та кількість спільних входжень для двох слів. І «ренесанс», і «шипіння» містять два повторення «e» та по одному спільному повторенню «r», «n», «s» і «c».
Знайдіть найпоширеніші елементи за допомогою most_common
Ще одна поширена операція над об’єктом лічильника Python — пошук елементів, які найчастіше зустрічаються.
Щоб отримати перші k найпоширеніших елементів у лічильнику, ви можете використати метод most_common() для об’єкта лічильника. Тут ми викликаємо most_common() для letter_count, щоб знайти три літери, які найчастіше зустрічаються.
>>> letter_count.most_common(3) [('e', 2), ('n', 2), ('a', 2)]
Ми бачимо, що літери «е», «н» і «а» зустрічаються двічі в слові «ренесанс».
Це особливо корисно, якщо лічильник містить велику кількість записів і вам цікаво працювати з найпоширенішими ключами.
Висновок
Ось короткий огляд того, чого ми навчилися під час уроку:
- Клас Counter із вбудованого модуля колекцій Python можна використовувати для отримання словника значень підрахунку всіх елементів у будь-якому ітераторі. Ви повинні переконатися, що всі елементи в ітерації можна хешувати.
- Ви можете оновити вміст одного об’єкта лічильника Python вмістом іншого об’єкта лічильника або будь-якого іншого ітерованого об’єкта за допомогою методу update() із синтаксисом: counter1.update(counter2). Зверніть увагу, що замість counter2 можна використовувати будь-який ітератор.
- Якщо ви хочете видалити вміст одного з ітераторів з оновленого лічильника, ви можете скористатися методом subtract(): counter1.subtract(counter2).
- Щоб знайти спільні елементи між двома об’єктами-лічильниками, ви можете використовувати оператор &. Дано два лічильники counter1 і counter2, counter1 & counter2 повертає перетин цих двох об’єктів лічильника.
- Щоб отримати k найбільш частих елементів у лічильнику, ви можете використати метод most_common(). counter.most_common(k) дає k найпоширеніших елементів і відповідну кількість.
Далі дізнайтеся, як використовувати типовий dict, ще один клас у модулі колекцій. Ви можете використовувати dict за замовчуванням замість звичайного словника Python для обробки відсутніх ключів.