キーのリストが辞書に存在するかどうかをPythonでチェック


91

私はそのような辞書を持っています:

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

と名前のリスト students = ('alex', 'john')

のすべての名前studentsgradesdictのキーとして存在することを確認する必要があります。

gradesより多くの名前を持つことができますが、のすべての名前studentsgrades

それを行う簡単な方法があるはずですが、私はまだPythonに慣れておらず、それを理解することができません。試しましたがif students in grades、機能しませんでした。

実際の場合、リストははるかに大きくなります。


回答:


202

使用all()

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

すごい!条件がFalseの場合に、DICから欠落している要素を取得するためのショートカット方法はありますか?
guival 2017

2
@guivalうん、あなたが集合演算を使用することができ、例えばset(students) - grades.keys()Pythonの3中
スヴェンMarnach

キーのリストのいずれかが文字列内の部分文字列であるかどうかを確認する方法はありますか?
ジョナサン

@ジョナサンどういう意味かわからない、多分any(k in my_string for k in keys)
Sven Marnach 2017

@SvenMarnachがany()を発見しました!それはまさに私が探していたものです:)
ジョナサン

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

それを呼び出すことclassは無効なので、私はそれをに変更しましたnames


とは対照的に、これはショートカットできませんall()。これは常にO(m + n)にnamesなりgradesます。ここで、mとnはとのそれぞれのサイズです。使用all()はO(m)になり、ショートカットになる可能性があります。
Sven Marnach 2012年

7
@SvenMarnachそうですね、別のアプローチなのでここに残しておきますが、あなたのアプローチが最善であることに同意します。
jamylak 2012年

間違いなくここに置いておきます!いずれにせよ、これは興味深いアプローチです。
Sven Marnach 2012年

3

学生をセットとして想定

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

セットに変換しない場合

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

0

<dict>.keys()返すを利用することで、いくつかのキーがdictにあるかどうかをテストできます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():
    ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.