3

次のような辞書のリストがあるとしましょう。

dictionList = {1: {'Type': 'Cat', 'Legs': 4},
               2: {'Type': 'Dog', 'Legs': 4},
               3: {'Type': 'Bird', 'Legs': 2}}

Typefor ループを使用して、フィールドが に等しい辞書をキャッチするまで、リストを反復処理し"Dog"ます。私の最善の試みは次のとおりです。

 for i in dictionList:
     if dictionList(i['Type']) == "Dog":
         print "Found dog!"

しかし、それは私に次のエラーを取得します:

TypeError: 'int' object has no attribute '__getitem__'

これを適切に行う方法についてのアイデアはありますか?

4

7 に答える 7

9

values辞書にはイテレータを使用します。

for v in dictionList.values():
    if v['Type']=='Dog':
         print "Found a dog!"

編集:あなたの元の質問Typeでは、辞書の値をチェックするように求めていると言いますが、これはやや誤解を招く恐れがあります。あなたが要求しているのは、「タイプ」と呼ばれる値の内容です。これは、あなたが何を望んでいるかを理解することとは微妙な違いかもしれませんが、プログラミングに関してはかなり大きな違いです。

Pythonでは、何かをタイプチェックする必要があるのはめったにありません。

于 2012-05-31T15:40:18.953 に答える
3

itervalues()を使用して、辞書の辞書を確認します。

for val in dictionList.itervalues():
   if val['Type'] == 'Dog':
      print 'Dog Found'
      print val

与える:

Dog Found
{'Legs': 4, 'Type': 'Dog'}

iter/を使用する必要はなくiteritems、値を調べるだけです。

于 2012-05-31T15:41:35.597 に答える
1
>>> diction_list = {1: {'Type': 'Cat', 'Legs': 4},
            2: {'Type': 'Dog', 'Legs': 4},
            3: {'Type': 'Bird', 'Legs': 2}}
>>> any(d['Type'] == 'Dog' for d in diction_list.values())
True
于 2012-05-31T15:39:54.580 に答える
1

間違った構文を使用していると思います...これを試してください:

>>> a = {1: {"Type": "Cat", "Legs": 4}, 2: {"Type": "Dog", "Legs": 4}, 3: {"Type": "Bird", "Legs": 2}}
>>> for item in a:
...     if a[item].get("Type") == "Dog":
...             print "Got it"
于 2012-05-31T15:46:52.393 に答える
1

試す

for i in dictionList.itervalues():
    if i['Type'] == "Dog":
        print "Found dog!"

問題は、あなたの例でiは、整数キーであるということです。itervaluesを使用すると、キー(解析するディクショナリ)の値を取得します。

于 2012-05-31T15:41:34.220 に答える
0

の値を出力してみてくださいi。彼らはあなたが思っているものではありません。これを行う方法は次のとおりです。

for key,  val in dictionList.items():
    #do stuff to val 
于 2012-05-31T15:42:07.780 に答える
0

ディクショナリでは、キーを介したアクセスが望ましいでしょう。あなたの場合、両方の辞書オブジェクトの場合。

for i in dictionList.keys():
    if dictionList[i]['Type'] == 'Dog':
        print i
于 2012-05-31T16:22:49.083 に答える