Понимание того, когда и где подходит каждый контейнер

Слишком часто новички выбирают привычное, а не оптимальное.

Большинство курсов Python знакомят студентов с контейнерными типами данных, начиная со списков. Естественно, новичкам с ними становится комфортно. Когда вы начинаете, вы сосредотачиваетесь на том, чтобы двигаться быстро и заняться следующей темой, чтобы узнать как можно больше, пока сохраняется мотивация. В результате вы вырабатываете привычки, которые работают, но не всегда являются лучшими практиками. Особенно это касается списков из-за их универсальности.

Большинство людей используют списки, когда было бы достаточно набора. Гораздо реже можно увидеть, что набор используется, когда требуется список. В этих случаях отсутствие информации обычно приводит к ошибке. Однако, поскольку списки содержат больше информации, чем наборы, использование списков вместо наборов обычно не приводит к ошибкам, что затрудняет определение того, когда набор должен использоваться.

Вот 3 подсказки, которые помогут определить, когда наборы имеют больше смысла, чем списки.

1. Порядок не имеет значения

В отличие от списков, наборы не хранят упорядоченные данные. Списки имеют индексированные и доступные данные, то есть каждый элемент можно извлечь. Невозможно получить доступ к отдельному элементу в наборе, потому что им не присвоен индекс.

Однако не все данные нужно индексировать. Например, тестирование членства. Проверка того, принадлежит ли элемент группе или нет, не требует индексации группы, поскольку она возвращает только оператор True или False.

2. Дубликаты не имеют значения

По определению наборы не могут содержать дубликатов. Это делает наборы идеальным контейнером для хранения уникальных предметов.

Фактически, этот атрибут делает тип данных set популярным методом удаления дубликатов из контейнера. Например, приведенный ниже код создает набор countries для поиска всех стран, получивших олимпийские медали в мужском спринте на 100 метров. Несмотря на то, что некоторые страны появляются в наборе данных несколько раз, countries удаляет эти повторяющиеся значения и возвращает только уникальные элементы.

Для дальнейшего уточнения набора используйте понимание набора. Подобно распознаванию списков, генерация множеств создает множество, сокращая цикл for до одной строки кода. Установленные понимания допускают дополнительные критерии. Например, указанное ниже понимание набора, startswith, находит все страны, получившие медали, и начинается с ‘B’.

3. Скорость обработки имеет значение

Поскольку наборы не хранят индексированные данные или дубликаты, они используют меньше памяти, чем списки, и менее затратны в вычислительном отношении. В результате наборы занимают меньше времени для поиска.

Чтобы проверить это, приведенный ниже код выполняет два теста на членство. В одном случае контейнер — это список, а в другом — набор. Оба контейнера имеют одинаковую длину, и оба случая хранят выходные данные в наборе.

Сохранение выходных данных случая списка в списке заняло бы больше времени и ввело бы в эксперимент еще одну переменную, тип выходных данных. Единственное различие между этими двумя случаями – тип контейнера, используемый для создания понимания множества.

На приведенной ниже диаграмме показана разница во времени между наборами и списками при проверке членства по мере увеличения размера контейнера.

Заключение

Как видите, во многих случаях наборы имеют преимущества перед списками. Надеюсь, эта статья помогла вам определить, когда использовать наборы, чтобы избежать чрезмерной зависимости от списков.

Спасибо, что прочитали мою статью. Если вам нравится мой контент, подпишитесь на меня. Кроме того, все отзывы приветствуются. Я всегда стремлюсь узнать новые или лучшие способы ведения дел. Не стесняйтесь оставлять комментарии или обращаться ко мне по адресу [email protected].