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

我有一本这样的字典:

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

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

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

grades可以有更多的名称,但是 students中的所有名称都应该在 grades

一定有一个简单的方法来做到这一点,但我仍然是新的巨蟒和不能理解它。试了 if students in grades没用。

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

104056 次浏览

Use all():

if all(name in grades for name in students):
# whatever
>>> 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

Calling it class is invalid so I changed it to names.

Assuming students as set

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

If not convert it to set

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

You can test if a number of keys are in a dict by taking advantage that <dict>.keys() returns a set.

This logic in code...

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

can be represented more briefly as:

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

The <= operator for sets tests for whether the set on the left is a subset of the set on the right. Another way of writing this would be <set>.issubset(other).

There are other interesting operations supported by sets: https://docs.python.org/3.8/library/stdtypes.html#set

Using this trick can condense a lot of places in code that check for several keys as shown in the first example above.

Whole lists of keys could also be checked for using <=:

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

Or if students is also a dict:

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