20

私は Python の初心者ですが、この構文を試してみましたが、理解できません。これは本当に不可解でした。

crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}

if crucial.keys() in dishes.keys():
    print dishes[value]

私がやりたいことは - もし critical がeggs皿にキー (この場合は ) を持っていれば、それは を返し2ます。単純に思えますが、どこかである種の構文を台無しにしているに違いないと思います。誰かが私を少し案内してくれれば、それは大歓迎です。

私が比較している実際の辞書は約 150 個のキーの長さですが、このコードが十分に単純であることを願っています。

4

7 に答える 7

23

重要なキーを繰り返し処理し、それぞれを料理キーと比較する必要があります。したがって、コードを直接変更したバージョンです。

for key in crucial.keys():
    if key in dishes.keys():
        print dishes[key]

次のように表現することをお勧めします (.keys を指定する必要はありません)。

for key in crucial:
    if key in dishes:
        print dishes[key]
于 2012-12-05T01:36:54.180 に答える
6

Python 3 を使用している場合keys、辞書のメソッドはsetインターフェイスに従います。つまり、&演算子を使用して 2 つの辞書のキーを交差させることができます。

for key in crucial.keys() & dishes.keys():
    print(dishes[key])

または、値のリストが必要な場合:

result = [dishes[key] for key in crucial.keys() & dishes.keys()]

Python 2 では、(おそらくiterkeysジェネレーターから) セットを明示的に作成することで同じことを管理できますが、他のいくつかの回答が示唆するように、キーを単純にループする方がよいでしょう。

これは、他の誰も見たことのないループのバリエーションです。外側のループはdishesdict からキーと値の両方を取得するため、キーごとに値を個別に検索する必要はありません。

for key, value in dishes.iteritems(): # use items() in Python 3
    if key in crucial:
        print value
于 2012-12-05T02:26:41.320 に答える
2

リスト内包表記を使用するのは良いことです

[ dishes[x] for x in crucial if dishes.has_key(x) ]

または、ニブラーによると:

[ dishes[x] for x in crucial if x in dishes ]

この式は critical のすべての key を反復します。key が dish の場合、同一の key の値を dish に返し、最後にすべての一致値のリストを返します。

または、この方法を使用できます (set (crucial) & set(dishes)) 両方のセットの共通キーを返し、このセットを繰り返して、値をお皿に返します。

[ dishes[x] for x in set (crucial) & set(dishes) ]
于 2012-12-05T01:44:41.683 に答える
0

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で多くの作業をしている人は、おそらく理解構文を好むでしょう。

于 2012-12-05T02:11:15.420 に答える
0

has_key()Python 3 で削除されました: http://docs.python.org/3.1/whatsnew/3.0.html#builtins

代わりに、次を使用できます。

[dishes[key] for key in crucial.keys() if key in dishes]

ここで使用される方法は、リスト内包表記と呼ばれます。ここでそれについて読むことができます:

http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

于 2012-12-05T01:47:30.623 に答える
-1
crucial = {'eggs': '','ham': '','cheese': ''}
dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}
for key in set(dishes.keys()) & set(crucial.keys()):
    print dishes[key]

set(dishes.keys()) - set(crucial.keys())同様に、 、set(dishes.keys()) | set(crucial.keys())、またはを使用できますset(dishes.keys()) ^ set(crucial.keys())

于 2016-12-25T04:16:25.927 に答える