2014-07-23 127 views
-1

如何检查字典(实际上是类似字典的对象)是否具有给定的所有键(复数)?检查字典是否有多个键

到目前为止,我已经使用:

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的方式?

+2

为什么downvote? – rvighne

回答

10

使用内置函数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 
+0

看起来很酷。你知道这种方法的性能如何吗?另外,你在'all'的参数中称为list-comprehension类型的东西 - 我以前从未见过这种语法。 – rvighne

+3

这是一个生成器表达式。它根据请求产生元素,并产生所有短路,并在知道它们后立即返回值。 –

+1

所以,它第一次看到一个'False'值,即该键不在'd'中,它会短路并返回'False',就像你的函数一样。 'all'的实现在我引用的Doc页面上给出。 –

-1

可以只使用关键字 “在” 例如: d = { 'A':1, 'B':2, 'C':3} 如果 'd' 在d: 打印 '是' 其他: 打印 '不'

+0

我想测试*多个*键。这只测试*一个*。 – rvighne

1

你也可以尝试这样的:

>>> names = { 
     'a' : 11, 
     'b' : 10, 
     'c' : 14, 
     'd': 7 
} 
>>> keys = ('a', 'b') 
>>> set(keys).issubset(names) 
True 
+4

根据'timeit',这是迄今为止最快的方法〜2x。还有更具表现力的IMO。 – rvighne

+2

@rvighne: - 是的,这是真的! –

+0

@rvighne:你能发布你的结果吗?我在时间上没有看到太多的差异。这种方式更快,但不是因子2. –

相关问题