Самый полезный модуль стандартной библиотеки Python, о котором все постоянно забывают

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.


В Python много отличных доступных «из коробки» модулей. Один из самых полезных — collections. Он содержит «специализированные типы для создания контейнеров», являющихся альтернативами универсальным dict, list, set и tuple. Ниже мы рассмотрим три содержащихся в модуле класса, с которыми большинство питонистов сталкивались, но постоянно забывают применять на практике.


NamedTuple


Сложно переоценить полезность именованных кортежей для дата-саентистов. Скажем, занимаетесь вы созданием новой модели, постоянно добавляя новые характеристики в список, который затем планируете скормить фреймворку для машинного обучения. С ростом количества характеристик, рано или поздно вы начнёте путаться и забывать, какой индекс за что отвечает. Ещё хуже, если с вашим кодом придётся работать коллегам: они могут вообще ничего не понять.


Всего пара строк может привести скрипт в порядок. Смотрите:


from collections import namedtuple

Features = namedtuple('Features', ['age', 'gender', 'name'])
row = Features(age=22, gender='male', name='Alex')
print(row.age)

Теперь для доступа к элементам строки вместо указания индексов можно использовать имена, что делает код значительно чище и проще.


Counter


Counter, как следует из названия, считает. Звучит несложно, но дата-саентистам нужно вести подсчёты постоянно, поэтому инструмент крайне полезен на практике.


Есть несколько способов создать счётчик, но самый простой — инициализировать его списком значений:


from collections import Counter

ages = [22, 22, 25, 25, 30, 24, 26, 24, 35, 45, 52, 22, 22, 22, 25, 16, 11, 15, 40, 30]
value_counts = Counter(ages)
print(value_counts.most_common())

Запустив этот код (что, кстати, можно сделать передав соответствующий сниппет в pythonanywhere.com/gists/), вы увидите:


[(22, 5), (25, 3), (24, 2), (30, 2), (35, 1), (40, 1), (11, 1), (45, 1), (15, 1), (16, 1), (52, 1), (26, 1)]

Список кортежей в порядке убывания распространённости значений, где первый элемент кортежа — значение, а второй — как часто оно встречается в изначальном списке. Пары строк кода оказалось достаточно, чтобы узнать, что «22» — самый распространённый возраст, и встречается он 5 раз.


DefaultDict


Один из моих самых любимых инструментов стандартной библиотеки. DefaultDict — словарь с дефолтным значением для любого нового ключа. Пример:


from collections import defaultdict

my_default_dict = defaultdict(int)
for letter in 'the red fox ran as fast as it could':
	my_default_dict[letter] += 1
print(my_default_dict)

Возвращает:


defaultdict(<type 'int'>, {'a': 4, ' ': 8, 'c': 1, 'e': 2, 'd': 2, 'f': 2, 'i': 1, 'h': 1, 'l': 1, 'o': 2, 'n': 1, 's': 3, 'r': 2, 'u': 1, 't': 3, 'x': 1})

При работе с обычным словарём пришлось бы постоянно проверять, существует ли ключ, и инициализировать несуществующие ключи вручную. В примере выше для каждого несуществующего ключа уже есть значение по умолчанию — 0. Это позволяет писать код чище и понятнее.


Помимо целочисленного, DefaultDict часто используют в связке с пустым списком, чтобы начинать добавление элементов без бойлерплейта.


Вперёд — к чистому коду!


Попробуйте вспомнить, можно ли применить классы из collections к задачам, которые вы недавно решали. Иногда «переоткрытие» старых модулей стандартной библиотеки приносит больше пользы, чем освоение новых инструментов.

Источник: https://habr.com/ru/post/478934/


Интересные статьи

Интересные статьи

Больше года назад хабравчанин keklick1337 опубликовал свой единственный пост  «Самый беззащитный — это Сапсан» в котором рассказывает как он без серьёзных ухищрений получил доступ ко внут...
Я уже лет 10 пишу код на питоне, и последние 2.5 года стабильно работал на американскую компанию. Наверно, многим знакома история, когда ты кодишь-кодишь, вроде всё непло...
От переводчика: все началось с топика на форуме D. После оценки скорости компиляции D по сравнению с другими языками мне было интересно, существует ли какой-нибудь язык, который компилир...
Большинство компиляторов C позволяют получить доступ к массиву extern с неопределёнными границами, например: extern int external_array[]; int array_get (long int index) { return external_ar...
Согласно многочисленным исследованиям поведения пользователей на сайте, порядка 25% посетителей покидают ресурс, если страница грузится более 4 секунд.