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 students
ada sebagai kunci dalam grades
dict.
grades
dapat memiliki lebih banyak nama, tetapi semua nama students
harus 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:
Penggunaan
all()
:if all(name in grades for name in students): # whatever
sumber
set(students) - grades.keys()
dengan 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
Memanggilnya tidak
class
valid jadi saya mengubahnya menjadinames
.sumber
all()
. Itu akan selalu menjadi O (m + n), di mana m dan n adalah ukurannames
dangrades
. Menggunakanall()
akan menjadi O (m), dan mungkin jalan pintas.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")
sumber
Anda dapat menguji apakah sejumlah kunci berada dalam sebuah dict dengan mengambil keuntungan yang
<dict>.keys()
mengembalikan aset
.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
students
juga dikt:if students.keys() <= grades.keys(): ...
sumber