14

是否有单行方法来检查 Python 2d dict 是否具有内部键/值?

现在我做这样的事情:

if d.has_key(k1):
    if d[k1].has_key(k2): 
        # do something

有一个更好的方法吗?

谢谢

4

6 回答 6

23
if k2 in d.get(k1, {}):
    # do something

如果您不关心 k1 是否实际存在,而只想知道 k2 是否存在,那么上面的片段很好。正如您从我的代码片段中看到的,我更喜欢in运算符,但您也可以简单地说

if d.get(k1, {}).has_key(k2):
    # do something

如果您更喜欢该习惯用法,但该has_key方法在 Python 3.x 中已被弃用,因此您可能应该避免使用它。

于 2012-06-26T17:17:05.720 回答
14

您可以使用in

if k1 in d and k2 in d[k1]:

has_key方法已被弃用,并在 Python 3.x 中被删除。

有关的:

于 2012-06-26T17:17:36.233 回答
6

我没有足够的声誉来发表评论,但请注意,如果 key1 的值为 None,那么最重要的建议将失败。

if k2 in d.get(k1, {}):
    # do something

如果d = {'k1': None}是这样,请确保您的密钥的值失败。

于 2015-11-20T01:57:02.333 回答
4
if d.has_key(k1) and d[k1].has_key(k2): 
于 2012-06-26T17:16:25.327 回答
2

你的第一个问题的答案是肯定的。我考虑伊莱的回答

if k2 in d.get(k1, {}):

最好的一个衬里,因为它避免在 d 中查找 k1 两次。第二个问题的答案取决于如果任一测试失败以及您想在两种失败情况下做不同的事情,您想做什么。如果是这样的话:

try:
    d1 = d[k1]
    if k2 in d1:
        <both tests passed>
    else:
        <second test failed>
except KeyError:
    <first test failed>
于 2012-06-26T22:04:25.957 回答
1

不要has_key()使用在 python 3.xget()has_key()已弃用的 use :

d.get(k1,None) and d[k1].get(k2,None): 
于 2012-06-26T17:19:16.403 回答