【问题标题】:Check if list of keys exist in dictionary [duplicate]检查字典中是否存在键列表[重复]
【发布时间】:2012-06-15 05:56:25
【问题描述】:

我有一本看起来像这样的字典:

grades = {
        'alex' : 11,
        'bob'  : 10,
        'john' : 14,
        'peter': 7
       }

还有名单students = ('alex', 'john')

我需要检查students 中的所有名称是否作为grades 字典中的键存在。

grades可以有多个名字,但students中的所有名字都应该在grades

必须有一个简单的方法来做到这一点,但我还是 python 的新手,无法弄清楚。试过if students in grades,没用。

在实际情况下,列表会更大。

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    您可以利用<dict>.keys() 返回set 的优势来测试字典中是否有多个键。

    代码中的这个逻辑...

    if 'foo' in d and 'bar' in d and 'baz' in d:
        do_something()
    

    可以更简单地表示为:

    if {'foo', 'bar', 'baz'} <= d.keys():
        do_something()
    

    集合的&lt;= 运算符测试左边的集合是否是右边集合的子集。另一种写法是&lt;set&gt;.issubset(other)

    集合还支持其他有趣的操作:https://docs.python.org/3.8/library/stdtypes.html#set

    使用这个技巧可以在检查多个键的代码中压缩很多地方,如上面的第一个示例所示。

    也可以使用&lt;=检查整个密钥列表:

    if set(students) <= grades.keys():
        print("All studends listed have grades in your class.")
    
    # or using unpacking - which is actually faster than using set()
    if {*students} <= grades.keys():
        ...
    

    或者如果students 也是一个字典:

    if students.keys() <= grades.keys():
        ...
    

    【讨论】:

      【解决方案2】:

      假设学生是一组

      if not (students - grades.keys()):
          print("All keys exist")
      

      如果不转成set

      if not (set(students) - grades.keys()):
          print("All keys exist")
      

      【讨论】:

        【解决方案3】:
        >>> grades = {
                'alex' : 11,
                'bob'  : 10,
                'john' : 14,
                'peter': 7
        }
        >>> names = ('alex', 'john')
        >>> set(names).issubset(grades)
        True
        >>> names = ('ben', 'tom')
        >>> set(names).issubset(grades)
        False
        

        称它为class 无效,因此我将其更改为names

        【讨论】:

        • all() 相比,这不能走捷径。它总是 O(m+n),其中 m 和 n 分别是 namesgrades 的大小。使用all() 将是 O(m),并且可能会走捷径。
        • @SvenMarnach 对,我将把它留在这里,因为这是另一种方法,但我同意你的方法是最好的。
        • 绝对放在这里!无论如何,这是一种有趣的方法。
        【解决方案4】:

        使用all():

        if all(name in grades for name in students):
            # whatever
        

        【讨论】:

        • 太棒了!如果条件为 False,有什么捷径可以获取 dic 中缺少的元素?
        • @guival 是的,您可以使用集合操作,例如set(students) - grades.keys() 在 Python 3 中。
        • 有没有办法检查任何一个键列表是否是字符串中的子字符串?
        • @Jonathan 不确定你的意思,也许是any(k in my_string for k in keys)
        • @SvenMarnach 刚刚发现了 any()!这正是我一直在寻找的:)
        猜你喜欢
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 2019-03-01
        • 1970-01-01
        • 2016-09-19
        • 2014-08-17
        相关资源
        最近更新 更多