如果键在键的受限列表中,我希望变量获取字典中(唯一)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解析模式的信息。)
答案 0 :(得分:7)
>>> 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
答案 1 :(得分:1)
使用列表理解并获取第一个元素:
[ m for m in modes if cli[m] ][0]
'auto'
答案 2 :(得分:0)
您甚至可以按以下方式使用列表理解功能(如果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']