いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【Python】辞書のバリューでキーをとってきたい

・お題:諸般の事情で、辞書型のvalueから対応するkeyをとって来る必要が出てきた。やってみたい。

 

・きっともっとエレガントなやり方があると思うが、私なりに考えてみた。

・とりあえず、辞書を作成する。

Dic1={"A":"a",
     "B":"b",
     "C":"c",
     "D":"c"}

・ここから、valueが"c"のキーをリストとしてとってきたい。最終的な出力は["C","D"]になってほしい。

・とりあえず、keyとvalueは以下で取得できるっぽい。list()でリスト化して使おうと思う。

Dic1.keys()

dict_keys(['A', 'B', 'C', 'D'])

Dic1.values()

dict_values(['a', 'b', 'c', 'c'])

・方針としては、valueを検索して、条件に合ったindexのkeyを返せば良さそう。例えば以下のような感じ。targetを変更すれば、他のvalueに対応するkeyを釣ってこれる。

target="c"

Lis1=[list(Dic1.keys())[n] for n in range(len(Dic1)) if list(Dic1.values())[n]==target]

・これで以下が返ってくる。一応目的の処理はできた。

['C', 'D']

・次に、valueが数値だった場合を考える。

Dic2={"A":0,
     "B":1,
     "C":1,
     "D":2}

target=1
Lis2=[list(Dic2.keys())[n] for n in range(len(Dic2)) if list(Dic2.values())[n]==target]

・これでLis2は['B', 'C']になる。targetよりもvalueが大きいkeyを引っ張ってきたいなら、boolを返すところを>にすれば良い。

Lis2=[list(Dic2.keys())[n] for n in range(len(Dic2)) if list(Dic2.values())[n]>target]

・これで、Lis2は['D']になった。

 

・次に、辞書のリストから特定のkeyのvalueを基準に辞書を引っ張ってくることを考える。とりあえず、辞書のリストを作成する。

Dic3=[{"A":"a","B":"0"},
     {"A":"aa","B":"1"},
     {"A":"aaa","B":"1"},
     {"A":"aaaa","B":"2"}]

・例えば、各辞書の"B"を確認し、そのvalueが2未満の辞書をとって来るなら、以下のような感じ。

Lis3=[d for d in Dic3 if d.get("B")<2]

・Lis3は以下になる。

[{'A': 'a', 'B': 0}, {'A': 'aa', 'B': 1}, {'A': 'aaa', 'B': 1}]

・いちおう目的の処理はできたっぽい。

 

おわり。