【问题标题】:How to check for multiple keys in a dictionary if they are set to None?如果字典中的多个键设置为无,如何检查它们?
【发布时间】:2014-07-11 20:59:43
【问题描述】:

我有以下可行的方法,但我希望看到一种更清洁或 Pythonic 的方式来做到这一点。

if options_dict['cids'] is not None and options_dict['mergekeys'] is not None:
   # do something

如果键 'cids' 和 'mergekeys' 存在,上述将解析为 true。有没有更好的方法来完成上述操作?另外,我怎样才能同时检查以下内容。

if options_dict['cids'] is None and options_dict['mergekeys'] is None:
   # do something

如果我能以一种优雅的方式在同一个 if 语句中结合以上两者,那就太棒了。

【问题讨论】:

  • 当您说is None时,您的意思是该值实际上是None还是没有键'cids'
  • 一个键可以在字典中,值为None,也可能根本不在字典中。您要检查以下哪种情况?
  • 键 'cids' 和 'mergekeys' 存在并且可以具有 None 的值(它们存在于字典中)。

标签: python dictionary


【解决方案1】:

您始终可以使用allgenerator expression

if all(options_dict[x] is not None for x in ('cids', 'mergekeys')):

虽然我个人认为您当前的解决方案更好。它比这个更清晰,更有效。

如果你的长度是问题,那么你可以简单地将它分成多行:

if options_dict['cids'] is not None and 
    options_dict['mergekeys'] is not None:

或者,为字典起一个更短的名称:

dct = options_dict
if dct['cids'] is not None and dct['mergekeys'] is not None:

all 和生成器表达式解决方案只能用于检查比两个或三个更多的键。

【讨论】:

  • 字面上落后你 2 秒 ;-)
  • 感谢您的回答!
【解决方案2】:

使用列表推导生成bools 的列表,判断相应选项是否为None

nones = [ options_dict[i] is None for i in [ 'cids', 'mergekeys' ] ]

然后您可以使用anyall 谓词来测试是否有任何或全部是None

if not any(nones):
    # not a single one was none

elif all(nones):
    # all were nones

【讨论】:

  • iCodez 答案中的生成器更好,因为它允许短路——尽管很容易将您的 nones 更改为生成器表达式:-)
  • 但是你不能重置发电机,所以再次 YMMV ;)
【解决方案3】:

我可能会这样做:

>>> from operator import itemgetter
>>> my_dict = {"hey": 1, "ho": 2, "let's": 3, "go": None}
>>> my_keys = "hey", "ho"
>>> my_values = itemgetter(*my_keys)
>>> my_values(my_dict)
(1, 2)
>>> None not in my_values(my_dict)
True
>>> my_keys = "let's", "go"
>>> my_values = itemgetter(*my_keys)
>>> my_values(my_dict)
(3, None)
>>> None not in my_values(my_dict)
False

【讨论】:

    【解决方案4】:

    确实,第二个孤立的最佳方法是:

    if options_dict['cids'] is options_dict['mergekeys'] is None:
    

    虽然我会亲自派遣:

    # give meaningful name
    flags = (options_dict['cids'] is None, options_dict['mergekeys'] is None)
    
    if all(flags):
        ...
    
    if not any(flags):
        ...
    
    else:
        ...
    

    【讨论】:

      猜你喜欢
      • 2017-09-06
      • 2018-07-28
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 2022-01-09
      • 2010-11-20
      相关资源
      最近更新 更多