【问题标题】:Check if dictionary has multiple keys检查字典是否有多个键
【发布时间】:2014-09-14 03:57:46
【问题描述】:

如何检查字典(实际上是类字典对象)是否包含所有给定的 keys(复数)集?

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

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

有没有更优雅和 Pythonic 的方式来做到这一点?

【问题讨论】:

    标签: python python-3.x dictionary key


    【解决方案1】:

    使用内置函数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 的参数中的列表理解类型是什么——我以前从未见过语法。
    • 那是一个生成器表达式。它会在请求元素时生成元素,all 会短路并在知道值后立即返回。
    • 所以,当它第一次看到False 值时,即密钥不在d 中,它会短路并返回False,就像你的函数一样。 all 的实现在我引用的 Doc 页面上给出。
    【解决方案2】:

    你也可以这样尝试:

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

    【讨论】:

    • 根据timeit,这是迄今为止最快的方法,速度快了约 2 倍。以及更具表现力的 IMO。
    • @rvighne:- 没错!
    • @rvighne:你能发布你的结果吗?我没有看到时间上有太大的不同。这种方式更快,但不是 2 倍。
    • @SukritKalra 抱歉格式错误:python3 -m timeit "{'a', 'b'}.issubset({ 'a': 1, 'b': 2, 'c': 4 })" 1000000 loops, best of 3: 0.754 usec per loop python3 -m timeit "all(elem in { 'a': 1, 'b': 2, 'c': 4 } for elem in {'a', 'b'})" 1000000 loops, best of 3: 1.54 usec per loop
    • 好的。因此,如果您增加字典中的元素数和要搜索的键数,那么当键是字典中键的子集时,时间上并没有太大差异。如果它们不是并且字典中不存在的键位于元组的末尾,那么我的版本会慢很多,如果键在开头,那么我的版本会快很多。猜猜这是你需要根据你的数据做出的权衡。
    【解决方案3】:

    您可以只使用关键字“in” 前任: d = {'a':1,'b':2,'c':3} 如果 'd' 在 d 中: 打印'是' 别的: 打印'不'

    【讨论】:

    • 我想测试多个键。这仅测试 一个
    猜你喜欢
    • 2013-11-16
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2010-11-20
    • 2021-12-07
    相关资源
    最近更新 更多