100

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

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

和名单students = ('alex', 'john')

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

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

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

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

4

4 回答 4

230

使用all()

if all(name in grades for name in students):
    # whatever
于 2012-06-12T10:52:50.510 回答
28
>>> 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.

于 2012-06-12T10:52:53.440 回答
5

假设学生为集合

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

如果不将其转换为设置

if not (set(students) - grades.keys()):
    print("All keys exist")
于 2018-11-15T15:45:52.517 回答
0

您可以利用<dict>.keys()返回 a来测试多个键是否在 dict 中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():
    ...
于 2020-05-21T22:57:53.413 回答