我有一个类似的字典:
grades = {
'alex' : 11,
'bob' : 10,
'john' : 14,
'peter': 7
}
以及名称列表students = ('alex', 'john')
我需要检查students
中的所有名称是否都作为grades
字典中的键存在。
grades
可以包含更多名称,但students
中的所有名称都应位于grades
必须有一种直截了当的方法来做到这一点,但我仍然是python的新手并且无法弄明白。尝试if students in grades
,没有工作。
在实际情况中,列表会更大。
答案 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():
...