2017-06-19 19 views
1

各キーに値として辞書があり(ネストされた辞書はすべて同じキーのセットを持っています)、辞書があります。サブキーに関する2つの条件に関連するキーを見つけることを試みています。別のサブキーを指定したサブキーの最大値はTrueです。例えばネストされた辞書に関連付けられたキーを見つけるためのPythonic方法

:それはSUBKEY1が "真である「subkey2」の最大値であるため、私は結果が「KEY2」になりたい

d = {'key1' : {'subkey1' : True, 'subkey2' : 4}, 
    'key2' : {'subkey1' : True, 'subkey2' : 8}, 
    'key3' : {'subkey1' : False, 'subkey2' : 1}, 
    'key4' : {'subkey1' : False, 'subkey2' : 9} } 

私は、すべてを配列に入れて、これらの値に関連付けられたインデックスを見つけることを望んでいますが、同じ情報を格納する変数を追加することなくこれを実現できるという印象があります。私はPythonには比較的新しいので、良い方法があるかもしれないと思いました。

提案がありますか?ありがとう!

+0

'd 'のキーと' subkey2'の値の両方を含むリストに、新しい辞書マッピングサブキーに物事をグループ化してフルスキャンする必要があります。これは効率的ではないでしょう。どのようにこの構造で終わったのですか? –

+0

dictをsubkey1がtrueのdictsのリストに変換してから、key関数でmax関数を使用してください –

答えて

1

これは、問題のオプション実装です。

まず、すべてのサブキー1をTrueでフィルタリングします。

第2に、フィルタリングされた辞書からサブキー2内の最大値を見つけます。

d = {'key1' : {'subkey1' : True, 'subkey2' : 4}, 
    'key2' : {'subkey1' : True, 'subkey2' : 8}, 
    'key3' : {'subkey1' : False, 'subkey2' : 1}, 
    'key4' : {'subkey1' : False, 'subkey2' : 9} } 

max_d = {v["subkey2"]:{k:v} for k,v in d.items() if v["subkey1"]} # create new dictionary that the key is the value from subkey2 and the value is the original key and value. 
max_int = max(max_d.keys(), key=int) # get the max key 

print (max_d[max_int]) # print the maximum 

>>> {'key2': {'subkey1': True, 'subkey2': 8}} 
+0

ありがとう!これがうまくいって、辞書の作成やmax()の使用についていくつか新しいことを学びました。 –

1

それは少し複雑ですが、どのようにこの件について:

print(d[max({key:d[key] for key in [k for k in d.keys() if d[k]['subkey1'] is True]})]) 

まず、我々は真としてSUBKEY1を持っている主なキーのリストを作成し、それらのそれぞれのために、我々は、キーと値のペアの辞書を再構築します最大値でキーを取得します

これは完全にテストされていませんので、時間を十分に考慮してください。あなたが必要な場合がありますどのような

1

はここfunctools

からreduceであるあなたが探しているかもしれないソリューションです。

from functools import reduce 
import operator 

d = {'key1' : {'subkey1' : True, 'subkey2' : 4}, 
    'key2' : {'subkey1' : True, 'subkey2' : 8}, 
    'key3' : {'subkey1' : False, 'subkey2' : 1}, 
    'key4' : {'subkey1' : False, 'subkey2' : 9} } 
maxsum=0 
for k in d: 
    if reduce(operator.getitem, [k,'subkey1'], d): 
     value = (reduce(operator.getitem, [k,'subkey2'], d)) 
     if maxsum<value: 
      maxsum=value 
print(maxsum) 

基本的にはどのようなこのreduce(operator.getitem, [k,'subkey1'], d)が行うことは、それはサブ辞書から値を取るです。たとえば:

d = {'John' : {'Male' : True, 'age' : 41}} 
reduce(operator.getitem, ['John','Male'], d) 

出力: - >男性とTrue

として我々はまた、引数としてリストを与えることができ、結果を取得します。ここ

True 

はジョンを通じて横断減らします。

from functools import reduce 
import operator 

d = {'John' : {'Male' : True, 'age' : 41}, 
     'Vishnu':{'Male':True ,'age':23}} 
chklist1 = ['John','Male'] 
chklist2 = ['Vishnu','age'] 
print(reduce(operator.getitem, chklist1, d)) 
print(reduce(operator.getitem, chklist2, d)) 

出力、これを見てみましょう:あなたは、常に辞書は辞書の辞書であることを期待することはできません

True 
23 

。それはdictのdictのdictのdictを言うことができる。 (誰が知っている?物事が起こる!)

from functools import reduce 
import operator 

d = { 
    "John":{ 
     "Age": 23, 
     "Sex": 'M', 
     "Country": 'USA' 
     }, 
    "Vishnu":{ 
     "Age": 1, 
     "Country": { 
      "India": 'TamilNadu', 
      "USA": None, 
      "South Africa": None 
     } 
     } 
} 
chklist1 = ['John','Age'] 
chklist2 = ['Vishnu','Country','India'] 
print(reduce(operator.getitem, chklist1, d)) 
print(reduce(operator.getitem, chklist2, d)) 

出力:

23 
TamilNadu 

だから今戻ってあなたの問題に来て:

for k in d: 
    if reduce(operator.getitem, [k,'subkey1'], d): 
     value = (reduce(operator.getitem, [k,'subkey2'], d)) 
     if maxsum<value: 
      maxsum=value 
print(maxsum) 

をごkey1,key2,...というようになり、すべてのキーkについて。最初にreduce(operator.getitem, [k,'subkey1'], d)に含まれる値がTrueまたはFalseであるかどうかを確認します。それがある場合のみ進めるTrue

次に、maxsumがdictのsub_dictの2番目の項目に設定されます。すべてのキーについてチェックされ、現在のキーよりも大きな値が見つかった場合は値が変更されます。あなたがあなたがプリントアウトできる最大値を見つけるまで。

関連する問題