2017-05-04 188 views
3

我有一本名爲data_dict的詞典字典。下面是它的外觀:在python詞典中搜索字典

{'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} 
} 

基本上它是

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

我想找到一個人的工資是一定X. 具體來說,在上述例子中的名稱格式 - 讓我們說我試圖找到工資爲288589的人的姓名。我期望所有工資爲288589的人的姓名。

我已經寫了以下廣義函數,它將採用搜索關鍵字和值並返回人員姓名哪一個在關鍵時刻,價值觀是真實的。

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(number_of_people),因爲字典訪問是O(1),但是,仍然是線性的。 – L3viathan

+0

這絕對看起來更好。雖然我會等待一段時間,然後再接受它作爲最佳答案。此外,我懷疑效率/時間複雜性明智的任何解決方案這樣的搜索會比O(number_of_people)更好。 –

+0

@PaleBlueDot他們可以是,如果你以前做過所有的搜索,也就是說,如果你製作一個反向字典,那麼你可以做'reversed_dict [「salary」] [288589]',那麼它會是O(1),但是如果您還想保留原始字典,則需要大約兩倍的內存空間。 – L3viathan