Дата и время публикации: Дата и время модификации:
Проблема и решение
1. Суть проблемы
Рассматриваются проблемы использования словаря, который также может использоваться в качестве прокси-объекта в виде ассоциативного массива с выборкой по ключу (mappings) [3.6], который реализуется в большинстве своем с помощью dict(inary) — словаря, состоящий из пары значений ключ / значение . На мой взгляд, интересным случаем является пример использования вложенного списка, статическое объявление которого показано в листинге 1.1
Листинг 1.1
... pkeys = { 'SESSION_MANAGER': [1, 1], 'SHELL': [3, 0], 'SHLVL': [2, 32], 'SSH_AGENT_LAUNCHER': [1, 4], 'SSH_AUTH_SOCK': [1, 7] } ...
Так же как, создание динамического словаря и определение минимум и максимума по выбранному значению во вложенном списке.
2. Решение
2.1 Создание динамического словаря
Показано в листинге 2.1.1
Листинг 2.1.1
... pkeys = {} for key in sorted (os.environ.keys()) : ... pkeys.update( { key:[nhits,rpos] } ) ... for k in pkeys : h,p=pkeys.get(k) print (k,h,p) ...
До начала цикла, где будут добавляться по ключу список значений, необходимо инициализировать пустой словарь. Затем, внутри цикла добавляем полученные в результате операций в данной области значения переменных nhits, rpos в виде списка.
Для извлечения значений используется in-оператор k in pkeys, который извлекает ключ — k, а уже потом, за пределами цикла в другом цикле, pkeys.get(k) извлекает список, содержащие ранее добавленные переменные nhits, rpos
2.2 Вычисление максимума и минимума вложенного списка
В Python, можно использовать методы min() и max(), которые находят наименьшее и наибольшее значение соответственно [3.3]. При этом, эти методы обычно используют для нахождения экстремумов в списках и строках, на которые можно найти достаточно информации. Поэтому, как мне кажется будет интересно найти минимумы и максимумы в словарях, отдельно для ранее сохраненных значений nhits и rpos
Метод max()/min()
Используется вызов max(iterable, key: ="func") для некоторого перечисляемого объекта (iterable) назначается функции (key: ="func"), на основе вычислений которой находится максимальное значение ключа, имя которого будет затем возвращено, как показано в дампе 2.2.1
Дамп 2.2.1
... class KHints(): def __init__(self): self.dkeys={} def __gethits(self,k) : (h,p)=self.dkeys.get(k) return h def domax(self) : return max(self.dkeys,key=self.__gethits) def domin(self) : return min(self.dkeys,key=self.__gethits) ... pkeys=KHints() ... pkeys.dkeys.update({k:[nhits,rpos]}) ... __minhave_k=pkeys.domax() (h,p)=pkeys.dkeys.get(__maxhave_k) ... __minhave_k=pkeys.domax() (h,p)=pkeys.dkeys.get(__maxhave_k)
Как показано в дампе 2.2.1, мне пришлось создать класс KHints, чтобы быть уверенным, что будет корректно разрешена проблема сканирования вложенного в словарь списка, чтобы получить экстремумы по максимуму и минимуму. При этом, не использовал в этом классе наследование для встроенного типа dict, потому что считается, что это плохая идея, т.к. существует проблема возврата экземпляра, найденного по ключу значение, даже несмотря на переопределение __getitem__ [3.5].
2.3 Извлечение значений из словаря
Как уже писал ранее в статье про прокси-объекты, что поиск и извлечение данных по ключевому слову осуществляется с использованием методов keys(), pop(), popitem(), setdefault(), update() и values(), при этом как оказалось последний не всегда может быть встребован, как показано в листинге 2.3.1
Листинг 2.3.1
... class _CommonAction(argparse.Action): ... def __init__(self, catcher, **kwargs ) : option_strings=self.__kwargs_get(kwargs,'option_strings') ... @staticmethod def __kwargs_get(kws,key): for k in kws.keys(): if k == key : return kws[k] return None ... class _TestRunAction(_CommonAction): ... def __init__(self, option_strings, dest, nargs=None, **kwargs ): super(_TestRunAction, self).__init__( catcher=self.catcher, option_strings=option_strings, dest=dest, nargs=nargs ,**kwargs )
В котором привел использование переменного числа параметров в конструкторе класса с ассоциативной выборкой по ключевому параметру, где используется метод dict().keys() для нахождения и последущего извлечения значения для искомого ключевого слова 'keyword' с использованием выражения вида kws['keyword'].
3. Библиография
3.1 Grepper. "find position of key in dictionary python" Code Answer
3.2 Stackoverflow - Update dictionary with dynamic keys and values in python
3.3 Career Кarma - Python Min and Max: The Ultimate Guide
3.4 How to use the max function with a key in Python