在Python字典中为变量分配True元素的键名?

时间:2018-11-27 19:13:16

标签: python list dictionary

如果键在键的受限列表中,我希望变量获取字典中(唯一)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解析模式的信息。)

3 个答案:

答案 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']