Дата и время публикации: Дата и время модификации:
Проблема и решение
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