× К оглавлению На главную Об авторе

Дата и время публикации:    
Дата и время модификации:

Проблема и решение

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

3.5 Don’t inherit Python built-in dict type

3.6 Как использовать прокси-объекты в Python

Сайт разработан в соответствии с рекомендациями консорциума W3C для языка разметки HTML5.

Об авторе можно прочитать здесь.

Copyright © 2015-2019 Андрей Ржавсков