2017-10-25 14 views
2

特定のdictキーが特定の値を持つすべての行を検索したいと思います。 本当に明確ではないが、一例であるので、ここで、そのように言った:特定のdictキーが特定の値を持つすべての行を見つける

data = [ 
    {'key1' : 'value1', 'key2' : 'value2'}, 
    {'key1' : 'value3', 'key2' : 'value4'}, 
    {'key1' : 'value1', 'key2' : 'value5'} 
] 

out = data['key1' == 'value1']['key2'] 

私はout['value2', 'value5']に等しいようにしたいと思いますが、実際にそれはすなわち'value2'

答えて

5

のみ最初の結果、バニラを返しリストや辞書

このためリストの内包を使用することができます。

[d['key2'] for d in data if d['key1'] == 'value1'] 
# \___ ___/ \_____ _____/ \___________ __________/ 
#  v   v     v 
#  yield  iterator    filter 

は(コメントはそれが簡単な構文を理解するために作るためにのみ使用されます)

だから我々はddataを反復処理する反復子です。 d['key1'] == 'value1'がある場合は、d['key2']を結果リストに追加します。

パンダ

パンダは、(大)データフレームを処理することを可能にするパッケージです。データフレームは非常に柔軟性がありますが、基本的な(したがって完全には一致しない)定義は、各行が同じ名前の列を持つ2次元表と見なすことです。あなたがパンダをインストールすることができます。

pip3 install pandas 

(またはため、pip install pandas

次の我々はそれをインポートしてパンダを使用することができます。

import pandas as pd 

次は我々がデータフレームを作ることができます

df = pd.DataFrame(data) 

これは次のようになります。

>>> df 
    key1 key2 
0 value1 value2 
1 value3 value4 
2 value1 value5 

今、我々がkey1'value1'あるSerieskey2の値を取得することができます。

df[df['key1'] == 'value1']['key2'] 

これは生産:

>>> df[df['key1'] == 'value1']['key2'] 
0 value2 
2 value5 
Name: key2, dtype: object 

をここでは、もちろん、単純な結果のために多くの仕事です、パンダは大規模なデータセットに対して妥当な時間に複雑なクエリを実行するために使用できます。

+1

今日この問題に出くわしました(この質問が掲載される前にこの解決策が指摘されました)。複数のマップ/フィルタを使用して計画していたものよりもはるかにエレガントな/ピジョンソニックソリューションです。 –

+0

@matrim_c:あなたはウェルカム:) –

+0

ありがとうウィレム!この構文データ['key1' == 'value1'] ['key2']はどうでしょうか?私はそれが非常にセクシーであることがわかります、この基準に答えるすべての行を返す方法はありますか? – Maxime

関連する問題