PythonのREPL(Read-Evaluate-Print-Loop-コードを入力してEnterキーを押すとすぐに評価されるもの)にまだ慣れていない場合は、ここで優れたツールになります。
それでは、コードの分解を始めましょう。
crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
十分に単純です。crucials
辞書に値がないことに注意してください。それがあなたの例の略語なのか、それとも単にキーだけを気にしているのかはわかりません。キーだけを気にしているのであれば、一意性を確保するために辞書を使用していると思います。その場合は、set
データ構造を確認する必要があります。
例:
crutial = set(['cheese', 'eggs', 'ham'])
続けて
if crucial.keys() in dishes.keys():
ここでは、in
比較演算子を使用しています。例:
5 in [5, 4] #True
3 in [5, 4] #False
評価crucial.keys()
しdishes.keys()
て得た場合
>>> crucial.keys()
['cheese', 'eggs', 'ham']
>>> dishes.keys()
['eggs', 'bacon', 'sausage', 'spam']
したがって、実行中にコードは次のように評価されます
['cheese', 'eggs', 'ham'] in ['eggs', 'bacon', 'sausage', 'spam']
False
これは、値['eggs', 'bacon', 'sausage']
(リスト)がリストにないために返されます(['eggs', 'bacon', 'sausage', 'spam']
実際、そのリストにはリストはなく、文字列のみです)。
したがって、あなたは次のように評価しています
if False:
print dishes[value] #note value is not defined.
in
ブール値とforイテレータ()を返す演算子を混合/混乱させたように見えますfor item in collection
。この種のものには構文があります。これはリスト内包表記と呼ばれ、@ShawnZhangと@kmadの回答でサンプルを見つけることができます。これは、コレクションをフィルタリングおよび変更(マップ)して、結果としてリストを返すための簡潔な方法と考えることができます。ここで深く掘り下げたくはありません。さもないと、関数型プログラミングの紹介になってしまいます。
他のオプションは、for .. in
反復とin
演算子を別々に使用することです。これは@timcが提供した解決策です。このようなソリューションは、初心者にとっておそらくより馴染みのある、またはより簡単なものです。反復とフィルタリングの動作を明確に分離します。また、リスト内包表記に相当するものがない他のプログラミング言語で書かれるものに似ています。Pythonで多くの作業をしている人は、おそらく理解構文を好むでしょう。