检查字典中是否存在一组键的列表

110

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

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

需要检查 students 列表中的所有名字是否都存在于 grades 字典中作为键。

grades 可以有更多的名字,但是 students 中的所有名字都应该在 grades 中出现。

应该有一种简单的方式来实现这个目标,但我还是 Python 新手,无法想出来。尝试过 if students in grades,但不起作用。

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

4个回答

256

使用all()函数:

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

太好了!如果条件为False,有没有快捷的方法获取字典中缺失的元素? - gdvalderrama
7
可以使用集合操作,例如在Python 3中使用set(students) - grades.keys() - Sven Marnach
@Jonathan 不太确定你的意思,也许是 any(k in my_string for k in keys) - Sven Marnach
@SvenMarnach 刚刚发现了 any()!这正是我正在寻找的 :) - Jonathan
1
@yomajo 这只是Python语法的定义。生成器表达式需要在括号中,但是单参数函数调用的括号也可以。如果你将一个生成器表达式传递给一个带有两个参数的函数,你需要额外的一对括号。 - Sven Marnach
显示剩余2条评论

31
>>> 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


1
这不能像 all() 一样进行快捷处理。它的时间复杂度始终为 O(m+n),其中 m 和 n 分别是 namesgrades 的大小。使用 all() 将是 O(m),并且可能会进行快捷处理。 - Sven Marnach
8
@SvenMarnach,好的,既然这是另一种方法,我会把它留在这里,但我同意你的方法是最好的。 - jamylak
2
绝对留在这里!无论如何,这都是一个有趣的方法。 - Sven Marnach

7
你可以通过利用 <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()

<= 运算符用于集合,它测试左侧的集合是否为右侧集合的子集。另一种写法是:<set>.issubset(other)

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

使用这个技巧可以压缩代码中检查多个键的许多地方,就像上面的第一个示例一样。

整个键列表也可以使用<= 进行检查:

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():
    ...

6
假设学生是一个集合。
if not (students - grades.keys()):
    print("All keys exist")

如果没有将其转换为集合,请进行转换。
if not (set(students) - grades.keys()):
    print("All keys exist")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接