Python перевіряє, чи існує список ключів у словнику


87

У мене є словник, який виглядає так:

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

і список імен students = ('alex', 'john')

Мені потрібно перевірити, чи всі імена studentsіснують як ключі в gradesdict.

gradesможе мати більше імен, але всі імена в studentsповинні бути вgrades

Це повинен бути прямий спосіб, але я все ще новачок у python і не можу це зрозуміти. намагався if students in grades, не працював.

У реальних випадках списки будуть значно більшими.


Відповіді:


195

Використання all():

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

Чудово! Будь-який спосіб швидкого доступу до елементів, які відсутні в диці, якщо умова хибна?
guival

2
@guival Yup, ти можеш використовувати набір операцій, наприклад, set(students) - grades.keys()у Python 3.
Свен Марнач,

чи є спосіб перевірити, чи є будь-який зі списку ключів підрядком у рядку?
Джонатан,

@ Джонатан Не знаєш, що ти маєш на увазі, можливо any(k in my_string for k in keys)?
Sven Marnach

@SvenMarnach щойно виявив будь-який ()! Це саме те, що я шукав :)
Джонатан,

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

7
@SvenMarnach Правильно, я просто залишу це тут, оскільки це інший підхід, але я погоджуюсь, що ваш найкращий.
jamylak

Однозначно залиште тут! Це цікавий підхід у будь-якому випадку.
Sven Marnach

3

Припускаючи, що студенти встановлені

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

Якщо не перетворити його на встановлений

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

0

Ви можете перевірити, чи є в ключі кількість ключів, скориставшись тим, що <dict>.keys()повертає a 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():
    ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.