如果键在键的限制列表中,我希望一个变量获得字典中(仅(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']