2017-05-04 18 views
3

私はdata_dictと呼ばれる辞書の辞書があります。以下は、それがどのように見えるかです:それは私が給料である特定のX. 具体的に、上記の例では人物の名前を見つけようとしています辞書のpython辞書で検索する

{Person Name : Dictionary of that person's attributes} 

形式のものであり、基本的に

{'UMANOFF ADAM S': {'total_stock_value': 'NaN', 'loans': 'NaN', 'salary': 288589}, 
'YEAP SOON': {'total_stock_value': 192758, 'loans': 'NaN', 'salary': 'NaN'}, 
'PIPER GREGORY F': {'total_stock_value': 880290, 'loans': 1452356, 'salary': 19791}, 
'Jack S': {'total_stock_value': 88000, 'loans': 'NaN', 'salary': 288589} 
} 

- さんが言って聞かせて私は給与が288589人の名前を見つけることを試みている。私は給与が288589であるすべての名前を期待する。

私は検索キーと値をとり、どのthキーで、値は真です。

def search_person_by_attribute(attribute, value): 
    person_names = [] 

    for person, attributes_dict in data_dict.items(): 
     if attributes_dict[attribute] == value: 
      person_names.append(person) 

    return person_names 

この方法は

results = search_person_by_attribute("salary", 288589) 
print(results) 

正常に実行され、版画

['UMANOFF ADAM S','Jack S'] 

しかし、どういうわけか、私はこれはかなり長い道のりがそれを書くある感じ。それを行うには、より良い/より短い/より多くのpythonic方法がありますか?

また、自分の提案したソリューションの効率性(時間の複雑さの点で)についても言及できれば、素晴らしいボーナスになります。

+0

あなたは、入力として現在の辞書を使用して、あなたのニーズに合わせた特殊な辞書を作成することができます。 –

+1

これをたくさんしているなら、 '{salary:(name1、name2)} 'の形式で新しい辞書を作成してみてはどうでしょうか? –

+0

@ Jean-FrançoisFabre&Chris_Rands本当にありません。私は質問で給料を例に挙げました。データセットは膨大で、給与だけでなく様々な属性を検索する必要があります。新しい辞書を作成するのは良い考えではありません。 :-) –

答えて

5

私はちょうど短いではありませんが、ご使用のバージョンよりも読みやすいと思いますこのような何か、を示唆している:

def search_person_by_attribute(d, attribute, value): 
    return [name for name in d if d[name][attribute] == value] 

私ので、それはまさにあなたのように動作しますが、追加のパラメータとして、辞書を必要としますそれはより良いスタイルだと思う:

>>> search_person_by_attribute(d, "salary", 288589) 
['UMANOFF ADAM S', 'Jack S'] 
+0

@Chris辞書アクセスはO(1)ですが、それでもなお線形ですので、O(number_of_people)です。 – L3viathan

+0

これは間違いなく良く見えます。私はしばらく待ってから、それを最高の答えとして受け入れます。また、そのような検索の解決策のどれかがO(number_of_people)よりも優れていることを、効率/時間の複雑さが賢明であると疑う。 –

+0

@PaleBlueDot逆順辞書を作成している場合は、 'reversed_dict [salary"] [288589] 'を実行すれば、O(1)になります。元の辞書を保持したい場合は、メモリの約2倍のスペースが必要になります。 – L3viathan