为变量指定Python dict中True元素的键名



如果键在键的限制列表中,我希望一个变量获得字典中(仅(True值的键名。

例如,我有一个Python字典:

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

和一个列表:

modes = [ 'auto', 'parse' ]

列表中恰好有一个键在字典中具有True值。我想让我的变量得到那个键的名称。

(其他键也可能为True,但不在列表中——在示例中,foo为True。(

在本例中,我想要一个变量mode来获得字符串'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的解析模式。(

>>> cli = { 'foo':True, 'bar':False, 'auto':True, 'parse':False }
>>> modes = [ 'auto', 'parse' ]
>>> next(mode for mode in modes if cli[mode])
'auto'

请注意,如果迭代器没有遇到True值,这将引发StopIteration。如果这是可能的,并且您希望表达式返回None而不是崩溃,则可以为next提供默认值。

>>> cli = { 'foo':True, 'bar':False, 'auto':False, 'parse':False }
>>> print(next((mode for mode in modes if cli[mode]), None))
None

使用列表理解并获得第一个元素:

[ m for m in modes if cli[m] ][0]
'auto'

您甚至可以使用以下列表理解(如果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']

最新更新