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

app*_*ief 69 python

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

grades = {
        'alex' : 11,
        'bob'  : 10,
        'john' : 14,
        'peter': 7
       }
Run Code Online (Sandbox Code Playgroud)

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

我需要检查所有名称是否students存在于gradesdict中作为键.

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

必须有一个简单的方法来做到这一点,但我仍然是python的新手,无法弄明白.试过if students in grades,没用.

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

Sve*_*ach 147

用途all():

if all(name in grades for name in students):
    # whatever
Run Code Online (Sandbox Code Playgroud)

  • @guival 是的,您可以使用集合操作,例如 Python 3 中的 `set(students) - grades.keys()`。 (6认同)

jam*_*lak 19

>>> 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
Run Code Online (Sandbox Code Playgroud)

调用它class是无效的,所以我将其更改为names.

  • @SvenMarnach对,我会把它留在这里,因为这是另一种方法,但我同意你的是最好的. (5认同)
  • 一定要留在这里!无论如何,这是一种有趣的方法。 (2认同)

Tod*_*odd 8

<dict>.keys()您可以利用返回的来测试字典中是否有多个键set

代码中的这个逻辑...

if 'foo' in d and 'bar' in d and 'baz' in d:
    do_something()
Run Code Online (Sandbox Code Playgroud)

可以更简单地表示为:

if {'foo', 'bar', 'baz'} <= d.keys():
    do_something()
Run Code Online (Sandbox Code Playgroud)

集合<=运算符测试左侧集合是否是右侧集合的子集。另一种写法是<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():
    ...
Run Code Online (Sandbox Code Playgroud)

或者 ifstudents也是一个字典:

if students.keys() <= grades.keys():
    ...
Run Code Online (Sandbox Code Playgroud)


小智 5

假设学生为集合

if not (students - grades.keys()):
    print("All keys exist")
Run Code Online (Sandbox Code Playgroud)

如果不将其转换为设置

if not (set(students) - grades.keys()):
    print("All keys exist")
Run Code Online (Sandbox Code Playgroud)