Обработка отсутствия ключей в Python с помощью setdefault

Обработка отсутствия ключей в Python с помощью setdefault

В полном соответствии с философией “быстрого прекращения” доступ к словарю dict с помощью конструкции d[k] возбуждает исключение, если ключ k отсутствует.

Любой питонист знает об альтернативной конструкции d.get(k, default), которая применяется вместо d[k], если иметь значение по умолчанию удобнее, чем обрабатывать исключение KeyError.

Однако если нужно обновить найденное значение (при условии, что оно изменяемое), то и __getitem__, и get оказываются неудобны и неэффективны.

В примере №1 показан неоптимальный скрипт, демонстрирующий одну ситуацию, когда dict.get – не лучший способ обработки отсутствия ключа.

Пример №1 основан на примере Алекса Мартелли, он генерирует индекс, показанный в примере №2. Оригинальный скрипт представлен на слайде 41 презентации Мартелли “Учим Python заново”. Его скрипт демонстрирует использование dict.setdefault, показанное в примере №3.

Пример №1. example0.py: применение метода dict.get для выборки и обновления списка вхождений слова в индекс(в примере №3 показано лучшее решение).

1. Получить список вхождений слова word или [], если оно не найдено.

2. Добавить новое вхождение в occurrences.

3. Поместить модифицированный список occurrences в словарь dict, при этом производится второй поиск в индексе.

4. При задании аргумента key функции sorted мы не вызываем str.upper, а только передаем ссылку на этот метод, чтобы sorted могла нормализовать слова перед сортировкой. Если кратко, мы используем метод в качестве полноправной функции.

Пример №2. Частичная распечатка результата работы скрипта №1, примененного к “Дзен Python”. В каждой строке присутствует слово и список его вхождений в виде пар(номер-строки, номер колонки).

Три строчки, относящиеся к обработке occurrences в примере №1, можно заменить одной, воспользовавшись методом dict.setdefault. Пример №1 ближе к оригинальному примеру Алекса Мартелли.

Пример №3. example.py: применение метода dict.setdefault для выборки и обновления списка вхождений слова в индекс. В отличие от примера №1, понадобилась только одна строчка.

1. Получаем список вхождений слова word или устанавливаем его равным [], если оно не найдено. Теперь список можно обновить без повторного поиска.

Как накрутить 1000 офферов на страницу, сколько это будет стоить? Портал pricesmm.com сравнивает прайсы сервисов, анализирует цены на биржах и сайтах-обменниках и делает выводы. А также рассуждает, чем офферы Вконтакте отличаются от живых подписчиков, и можно ли заметить это отличие.

Иными словами, строка:

дает такой же результат, как:

с тем отличием, что во втором фрагменте производится по меньшей мере два поиска ключа(три, если ключ не найден), тогда как setdefault довольствуется единственным поиском.

Советуем вам следующее видео к просмотру

PythonLearn