如何检查字典(实际上是类似字典的对象)是否具有给定的所有键键(复数)?检查字典是否有多个键
到目前为止,我已经使用:
d = { 'a': 1, 'b': 2, 'c': 3 }
keys = ('a', 'b')
def has_keys(d, keys):
for key in keys:
if not key in d:
return False
return True
是否有这样做的更优雅和Python的方式?
如何检查字典(实际上是类似字典的对象)是否具有给定的所有键键(复数)?检查字典是否有多个键
到目前为止,我已经使用:
d = { 'a': 1, 'b': 2, 'c': 3 }
keys = ('a', 'b')
def has_keys(d, keys):
for key in keys:
if not key in d:
return False
return True
是否有这样做的更优雅和Python的方式?
使用内置函数all()
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> keys = ('a', 'b')
>>> all(elem in d for elem in keys)
True
>>> keys = ('a', 'b', 'd')
>>> all(elem in d for elem in keys)
False
看起来很酷。你知道这种方法的性能如何吗?另外,你在'all'的参数中称为list-comprehension类型的东西 - 我以前从未见过这种语法。 – rvighne
这是一个生成器表达式。它根据请求产生元素,并产生所有短路,并在知道它们后立即返回值。 –
所以,它第一次看到一个'False'值,即该键不在'd'中,它会短路并返回'False',就像你的函数一样。 'all'的实现在我引用的Doc页面上给出。 –
可以只使用关键字 “在” 例如: d = { 'A':1, 'B':2, 'C':3} 如果 'd' 在d: 打印 '是' 其他: 打印 '不'
我想测试*多个*键。这只测试*一个*。 – rvighne
你也可以尝试这样的:
>>> names = {
'a' : 11,
'b' : 10,
'c' : 14,
'd': 7
}
>>> keys = ('a', 'b')
>>> set(keys).issubset(names)
True
根据'timeit',这是迄今为止最快的方法〜2x。还有更具表现力的IMO。 – rvighne
@rvighne: - 是的,这是真的! –
@rvighne:你能发布你的结果吗?我在时间上没有看到太多的差异。这种方式更快,但不是因子2. –
为什么downvote? – rvighne