У меня есть словарь, который выглядит так:
grades = {
'alex' : 11,
'bob' : 10,
'john' : 14,
'peter': 7
}
и список имен students = ('alex', 'john')
Мне нужно проверить, что все имена students
существуют как ключи в grades
dict.
grades
может иметь больше имен, но все имена students
должны быть вgrades
Должен быть простой способ сделать это, но я все еще новичок в python и не могу понять этого. пробовал if students in grades
, не сработало.
В реальных случаях списки будут намного больше.
Ответы:
Использование
all()
:if all(name in grades for name in students): # whatever
источник
set(students) - grades.keys()
в Python 3.any(k in my_string for k in keys)
?>>> 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 (м) и может сократить.Принимая студентов как набор
if not (students - grades.keys()): print("All keys exist")
Если не преобразовать его в набор
if not (set(students) - grades.keys()): print("All keys exist")
источник
Вы можете проверить, есть ли в dict несколько ключей, воспользовавшись преимуществом, которое
<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(): ...
источник