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


87

我有一本类似的字典:

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

和名字列表 students = ('alex', 'john')

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

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

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

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


Answers:


195

用途all()

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

大!如果条件为False,有什么捷径可以获取dic中缺少的元素?
吉瓦尔

2
@guival是的,你可以使用组操作,如set(students) - grades.keys()在Python 3
斯文Marnach

有没有办法检查键列表中的任何一个是否是字符串中的子字符串?
乔纳森

@乔纳森不确定你的意思,也许any(k in my_string for k in keys)吗?
Sven Marnach '17

@SvenMarnach刚刚发现了any()!那正是我在寻找的东西:)
乔纳森(Jonathan)

22
>>> 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分别是names和的大小grades。使用all()将是O(m),并且可能是捷径。
Sven Marnach 2012年

7
@SvenMarnach对,我将其保留在这里,因为这是另一种方法,但是我同意您的方法是最好的。
jamylak 2012年

绝对把它留在这里!无论如何,这都是一种有趣的方法。
Sven Marnach 2012年

3

假设学生是固定的

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

如果不转换为设置

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

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():
    ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.