Python memeriksa apakah daftar kunci ada dalam kamus

91

Saya memiliki kamus yang terlihat seperti itu:

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

dan daftar nama students = ('alex', 'john')

Saya perlu memeriksa bahwa semua nama studentsada sebagai kunci dalam gradesdict.

gradesdapat memiliki lebih banyak nama, tetapi semua nama studentsharus dalamgrades

Pasti ada cara mudah untuk melakukannya, tapi saya masih baru mengenal python dan tidak bisa memahaminya. mencoba if students in grades, tidak berhasil.

Dalam kasus yang sebenarnya, daftarnya akan jauh lebih besar.

tepuk tangan
sumber

Jawaban:

202

Penggunaan all():

if all(name in grades for name in students):
    # whatever
Sven Marnach
sumber
Bagus! Adakah cara pintas untuk mendapatkan elemen yang hilang dari dic jika kondisinya False?
guival
2
@guival Yup, Anda dapat menggunakan operasi set, misalnya set(students) - grades.keys()dengan Python 3.
Sven Marnach
apakah ada cara untuk memeriksa apakah ada dari daftar kunci yang merupakan sub string dalam sebuah string?
Jonathan
@Jonathan Tidak yakin apa yang Anda maksud, mungkin any(k in my_string for k in keys)?
Sven Marnach
@SvenMarnach baru saja menemukan ()! Itulah yang saya cari :)
Jonathan
24
>>> 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

Memanggilnya tidak classvalid jadi saya mengubahnya menjadi names.

jamylak
sumber
Ini tidak bisa jalan pintas, berbeda dengan all(). Itu akan selalu menjadi O (m + n), di mana m dan n adalah ukuran namesdan grades. Menggunakan all()akan menjadi O (m), dan mungkin jalan pintas.
Sven Marnach
7
@SvenMarnach Benar, saya akan meninggalkannya di sini karena ini adalah pendekatan lain tetapi saya setuju bahwa milik Anda adalah yang terbaik.
jamylak
Tinggalkan saja di sini! Bagaimanapun, ini adalah pendekatan yang menarik.
Sven Marnach
3

Dengan asumsi siswa sebagai himpunan

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

Jika tidak mengubahnya menjadi set

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

Anda dapat menguji apakah sejumlah kunci berada dalam sebuah dict dengan mengambil keuntungan yang <dict>.keys()mengembalikan a set.

Logika ini dalam kode ...

if 'foo' in d and 'bar' in d and 'baz' in d:
    do_something()

dapat direpresentasikan secara lebih singkat sebagai:

if {'foo', 'bar', 'baz'} <= d.keys():
    do_something()

The <=Operator untuk tes set untuk apakah set di sebelah kiri adalah subset dari set di sebelah kanan. Cara lain untuk menulis ini adalah <set>.issubset(other).

Ada operasi menarik lainnya yang didukung oleh set: https://docs.python.org/3.8/library/stdtypes.html#set

Menggunakan trik ini dapat menyingkat banyak tempat dalam kode yang memeriksa beberapa kunci seperti yang ditunjukkan pada contoh pertama di atas.

Seluruh daftar kunci juga dapat diperiksa untuk menggunakan <=:

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():
    ...

Atau jika studentsjuga dikt:

if students.keys() <= grades.keys():
    ...
Todd
sumber