Python, sözlükte anahtar listesi olup olmadığını kontrol edin


91

Şuna benzeyen bir sözlüğüm var:

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

ve bir isim listesi students = ('alex', 'john')

Tüm isimlerin diktede studentsanahtar olarak var olup olmadığını kontrol etmem gerekgrades

gradesDaha fazla isim olabilir ancak tüm isimler studentsolmalıdırgrades

Bunu yapmanın basit bir yolu olmalı, ancak hala python'da yeniyim ve çözemiyorum. denedi if students in grades, işe yaramadı.

Gerçek durumlarda, listeler çok daha büyük olacaktır.


Yanıtlar:


202

Kullanım all():

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

Harika! Koşul Yanlış ise, dic'te eksik olan öğeleri almanın kısayol yolu var mı?
guival

2
@guival Yup, set(students) - grades.keys()Python 3'te set işlemlerini kullanabilirsiniz .
Sven Marnach

Bir anahtar listesinden herhangi birinin bir dizedeki bir alt dize olup olmadığını kontrol etmenin bir yolu var mı?
Jonathan

@Jonathan Ne demek istediğinizden emin değil misiniz any(k in my_string for k in keys)?
Sven Marnach

@SvenMarnach herhangi bir () keşfetti! Tam olarak aradığım buydu :)
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

Onu aramak classgeçersiz, bu yüzden olarak değiştirdim names.


Bunun aksine, kısa kesilemez all(). Her zaman O (m + n), burada m ve n ayrı ayrı boyutları olur namesve grades. Kullanımı all()O (m) olacaktır ve kısa yol olabilir.
Sven Marnach

7
@SvenMarnach Doğru, başka bir yaklaşım olduğu için burada bırakacağım ama seninkinin en iyisi olduğuna katılıyorum.
jamylak

Kesinlikle burada bırakın! Her durumda ilginç bir yaklaşım.
Sven Marnach

3

Öğrencileri set olarak varsaymak

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

Ayarlamak için dönüştürmezseniz

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

0

Anahtarlarının bir numara yararlanarak bir dict iseniz test edebilirsiniz <dict>.keys()bir döner set.

Koddaki bu mantık ...

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

daha kısaca şu şekilde temsil edilebilir:

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

<=Soldaki kümesi olsun için takımlar testler için operatör sağda kümesinin bir alt kümesidir. Bunu yazmanın başka bir yolu da olabilir <set>.issubset(other).

Setler tarafından desteklenen başka ilginç işlemler de vardır: https://docs.python.org/3.8/library/stdtypes.html#set

Bu numarayı kullanmak, kodda yukarıdaki ilk örnekte gösterildiği gibi birkaç anahtarı kontrol eden birçok yeri yoğunlaştırabilir.

Tüm anahtar listeleri de kullanım için kontrol edilebilir <=:

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

Veya studentsaynı zamanda bir buyruk ise:

if students.keys() <= grades.keys():
    ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.