如何检查字典中多个键是否为 None?

2 投票
4 回答
1331 浏览
提问于 2025-04-18 13:00

我有以下代码,它可以正常工作,但我想看看有没有更简洁或更符合Python风格的方法来实现这个。

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

上面的代码会在'cids'和'mergekeys'这两个键存在时返回真。有没有更好的方法来实现这个呢?另外,我还想同时检查以下内容。

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

如果我能把以上两个条件合并到同一个if语句中,那就太好了,想要一种优雅的写法。

4 个回答

0

其实,单独处理第二个的最佳方法是:

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:
    ...
0

我可能会这样做:

>>> 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
1

使用列表推导式来创建一个布尔值(bool)的列表,这个列表用来表示每个选项是否是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
3

你可以使用all和一个生成器表达式来实现:

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和生成器表达式的方案,主要是用来检查超过两个或三个键的情况。

撰写回答