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.


Jawaban:


202

Penggunaan all():

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

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.


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")

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():
    ...
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.