Python检查词典中是否存在键列表

时间:2012-06-12 10:51:21

标签: python

我有一个类似的字典:

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

以及名称列表students = ('alex', 'john')

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

grades可以包含更多名称,但students中的所有名称都应位于grades

必须有一种直截了当的方法来做到这一点,但我仍然是python的新手并且无法弄明白。尝试if students in grades,没有工作。

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

4 个答案:

答案 0 :(得分:132)

使用all()

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

答案 1 :(得分:18)

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

答案 2 :(得分:1)

假定学生为

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

如果不将其转换为设置

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

答案 3 :(得分:0)

您可以利用<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():
    ...