ner*_*com 2 python dictionary list
如果密钥位于受限制的密钥列表中,我想要一个变量来获取字典中(唯一)True值的键名.
例如,我有一个Python字典:
cli = { 'foo':True, 'bar':False, 'auto':True, 'parse':False }
Run Code Online (Sandbox Code Playgroud)
和一份清单:
modes = [ 'auto', 'parse' ]
Run Code Online (Sandbox Code Playgroud)
列表中的其中一个键在字典中具有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'
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法(理想情况下,使用列表并且没有每个密钥名称的冗余源代码)?
(FWIW,这是关于使用docopt解析模式.)
>>> cli = { 'foo':True, 'bar':False, 'auto':True, 'parse':False }
>>> modes = [ 'auto', 'parse' ]
>>> next(mode for mode in modes if cli[mode])
'auto'
Run Code Online (Sandbox Code Playgroud)
请注意,如果迭代器没有遇到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
Run Code Online (Sandbox Code Playgroud)