代码之家  ›  专栏  ›  技术社区  ›  nerdfever.com

在Python dict中为变量赋值True元素的键名?

  •  2
  • nerdfever.com  · 技术社区  · 7 年前

    我想要一个变量来获取字典中(唯一)真值的键名,如果该键在一个受限制的键列表中。

    例如,我有一本Python字典:

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

    modes = [ 'auto', 'parse' ]
    

    列表中只有一个键在字典中具有真值。我希望我的变量获得该键的名称。

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

    在本例中,我需要一个变量 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'  
    

    是否有更好的方法(理想情况下,使用列表并且不使用每个键名的冗余源代码)?

    3 回复  |  直到 7 年前
        1
  •  7
  •   Kevin    7 年前
    >>> cli = { 'foo':True, 'bar':False, 'auto':True, 'parse':False }
    >>> modes = [ 'auto', 'parse' ]
    >>> next(mode for mode in modes if cli[mode])
    'auto'
    

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

    >>> cli = { 'foo':True, 'bar':False, 'auto':False, 'parse':False }
    >>> print(next((mode for mode in modes if cli[mode]), None))
    None
    
        2
  •  1
  •   kantal    7 年前

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

    [ m for m in modes if cli[m] ][0]
    'auto'
    
        3
  •  0
  •   Akash Swain    7 年前

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