如何检查字典中多个键是否为 None?
我有以下代码,它可以正常工作,但我想看看有没有更简洁或更符合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' ] ]
然后你可以使用any
和all
这两个函数来检查是否有任何一个或所有的选项都是None
:
if not any(nones):
# not a single one was none
elif all(nones):
# all were nones
3
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
和生成器表达式的方案,主要是用来检查超过两个或三个键的情况。