Назначить переменной имя ключа Истинного элемента в Python dict? - PullRequest
0 голосов
/ 27 ноября 2018

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

Например, у меня есть словарь Python:

cli = { 'foo':True, 'bar':False, 'auto':True, 'parse':False }

и список:

modes = [ 'auto', 'parse' ]

Точно один из ключей в списке имеет значение True в словаре.Я хочу, чтобы моя переменная получила имя этого ключа.

(Другие ключи также могут быть True, но не в списке - в примере foo - True.)

В этом примере я хочу переменную mode, чтобы получитьstring 'auto'.

Прямо сейчас я делаю это так (без списка):

if   cli['1day']:       mode = '1day'
elif cli['auto']:       mode = 'auto'
elif cli['forceall']:   mode = 'forceall'
elif cli['updateonly']: mode = 'updateonly'
elif cli['force']:      mode = 'force'
elif cli['reparse']:    mode = 'reparse'
elif cli['parse']:      mode = 'parse'
elif cli['mirror']:     mode = 'mirror'  

Есть ли лучший способ (в идеале, используя список и без избыточногоисходный код каждого ключевого имени)?

(FWIW, речь идет о режимах синтаксического анализа с docopt.)

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Используя понимание списка и получить первый элемент:

[ m for m in modes if cli[m] ][0]
'auto'
0 голосов
/ 29 ноября 2018

Вы можете даже использовать понимание списка следующим образом (Это даст вам пустой список, если value in modes не в cli.keys()):

cli = { 'foo':True, 'bar':False, 'auto':True, 'parse':False }
modes = [ 'auto', 'parse' ]
print ([i for i in cli if i in modes if cli.get(i)])
# Result --> ['auto']
0 голосов
/ 27 ноября 2018
>>> cli = { 'foo':True, 'bar':False, 'auto':True, 'parse':False }
>>> modes = [ 'auto', 'parse' ]
>>> next(mode for mode in modes if cli[mode])
'auto'

Обратите внимание, что это вызовет StopIteration, если итератор не встретит значение True.Если это возможно, и вы бы предпочли, чтобы выражение возвращало None вместо сбоя, вы можете указать значение по умолчанию для next.

>>> cli = { 'foo':True, 'bar':False, 'auto':False, 'parse':False }
>>> print(next((mode for mode in modes if cli[mode]), None))
None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...