2012-01-24 75 views
0

我有一個代表人的2維詞典。下面是其一個例子:搜索2維詞典

>>> people = {'pk1':{'firstname':'Brian', 'age':42}, 'pk2':{'firstname':'Alex', 
'age':50}} 

如可以看到的,存在在每個條目中的主鍵。每個人然後指向包含關於特定人的信息的字典。如何搜索整個'人物'字典,將所有年齡爲42歲的人都歸還給我?

+0

你想要什麼結果?包含與過濾器匹配的每個人的主鍵的列表?你是在尋找代碼來做一次搜索,或者尋找可以從代碼中的幾個地方調用的可重用函數? –

回答

5

如果你想使用可以執行你可以使用像各種搜索更通用的功能:

def findPeople(people, filter): 
    ret = {} 
    for k, v in people.items(): 
     if filter(v): 
      ret[k] = v 
    return ret 

那麼對於年齡== 42,你可以這樣調用它:

findPeople(people, lambda x: x['age'] == 42); 
1

布朗特方法看起來是這樣的:

def find_in_dict(d, criterion, lookup): 
    result = [] 
    for key, val in d.iteritems(): 
     if criterion in val and val[criterion] == lookup: 
      result.append((key,val)) 
    return result 

>>> people = {'pk1':{'firstname':'Brian', 'age':42}, 'pk2':{'firstname':'Alex', 'age':50}} 
>>> find_in_dict(people, 'age', 42) 

您可以根據您的需要有個人的關鍵或不改變結果的格式。

2

將這樣的事情對你的工作:

def search(primary, key, value): 
    for secondary in primary.values(): 
     if secondary.get(key) == value: 
      yield secondary 

例子:

>>> for i in search(people, 'age', 42): 
...  print(i) 
{'firstname':'Brian', 'age':42} 

一個行的解決辦法是:

[secondary for secondary in people.values() if secodary.get('age') == 42] 

注:採用.get()將允許您搜索密鑰,即使該k ey不存在於每個二級字典中。

+0

+1生成器 – KobeJohn

4

如果您需要主鍵:

>>> [{id: value} for id, value in people.iteritems() if value['age'] == 42] 
[{'pk1': {'age': 42, 'firstname': 'Brian'}}] 

如果你不這樣做:

>>> [value for value in people.itervalues() if value['age'] == 42] 
[{'age': 42, 'firstname': 'Brian'}] 
4

使用list comprehension

>>> [p for p in people if people[p]['age'] == 42] 
['pk1'] 
+0

不錯,簡潔,但如果你解釋爲什麼它是一種很好的方法來做事,這將是一個更好的答案。教最初的海報去釣魚,不要只給他們一份魚。 –

+0

@JimDeLaHunt:好點,加了一個鏈接。 –

1

這裏的其他答案很好,應該做你所問。

我假設它來自數據庫,並且您不直接在數據庫中執行此查詢,因爲您需要對相同數據的不同角度?如果是這樣,您可以通過使用像SQLAlchemy這樣的智能系統獲得同樣有效的結果。如果你實際上不需要進行各種交互,我會建議直接從數據庫中獲取數據,因爲它們已經被用來高效地完成這種事情。

+0

我正在閱讀來自XML文件的一堆測試結果。我從測試類,測試名稱等東西組成主要。然後,我需要做一些搜索,比如哪一個通過,哪些失敗。謝謝。 – dublintech