2017-01-18 10 views
2

私はPythonにリストを持っており、その辞書には辞書が含まれています。Pythonで辞書の辞書の値を照会する方法は?

{'METTS MARK': {'salary': 365788, 'po': 1}, 'HARRY POTTER':{'salary': 3233233, 'po': 0} 

'po' = 1でレコード数を計算するにはどうすればよいですか?

私はこの試みた:

sum = 0 
for key, values in DIC: 
    if values[po] == 1: 
     sum = sum + 1 

をしかし、それは返す:事前

+0

'DIC.items()'を使って 'key'と' value'を取得します。 –

答えて

6

too many values to unpack

おかげであなたは単に条件の上にsumとの和を使用することができます。

total = sum(values.get('po') == 1 for values in DIC.values()) 

ましたは@VPfBのようになります:

total = sum (1 for item in DIC.values() if item.get('po') == 1) 

ですが、後者は少し効率が悪いです。

それが文字列であるので、あなたはまた、代わりにpo'po'を使用する必要があり、これは'po'はすべての辞書の一部でない場合、それが動作することを保証するので、あなたはより良い.get('po')を使用しています。

だと思います。forループ.items()を忘れました。辞書を反復することによって、のキーに対してを繰り返します。この場合、のキーを2つの要素でタプルに展開することはできません。

しかし、ジェネレータを使用すると、メモリ効率が向上し(おそらく高速でも)、クリーンなコードになります。さらに、.itemsの代わりに.valuesを直接反復することで、パッキングとアンパックを節約できるため、パフォーマンスの向上が期待されます。

+0

@MYGz:ありがとう、私は '.get'を使うように更新しました。 –

+0

.get( 'po'、0)を使うべきです。あなたのバージョンでは、Noneのため例外があります。そして、sum()はリストを使って、そしてジェネレータを使ってより速く動作します。したがって、DIC.values()の値には[values.get( 'po'、0)== 1]を使用する方が良いでしょう) –

+0

@OleksandrDashkov:キーが存在しない場合、 'None'が返されます'None == 1'は' False'を生成します(したがってゼロとしてカウントします)。 'values ['po']'が '2 'である可能性があります。あなたはこれらを2回カウントしたくない場合、これらを排除する必要があります。 –

2

あなたはこのようにそれを取得することができます:

a = { 
    'METTS MARK': {'salary': 365788, 'po': 1}, 
    'HARRY POTTER': {'salary': 3233233, 'po': 0} 
    } 

print(len([b for b in a.values() if b.get('po')==1])) 

出力:

1 

ここでは、キーpo==1辞書のリストを作成しています。そして、リストの長さを計算します。