我有一個代表人的2維詞典。下面是其一個例子:搜索2維詞典
>>> people = {'pk1':{'firstname':'Brian', 'age':42}, 'pk2':{'firstname':'Alex',
'age':50}}
如可以看到的,存在在每個條目中的主鍵。每個人然後指向包含關於特定人的信息的字典。如何搜索整個'人物'字典,將所有年齡爲42歲的人都歸還給我?
我有一個代表人的2維詞典。下面是其一個例子:搜索2維詞典
>>> people = {'pk1':{'firstname':'Brian', 'age':42}, 'pk2':{'firstname':'Alex',
'age':50}}
如可以看到的,存在在每個條目中的主鍵。每個人然後指向包含關於特定人的信息的字典。如何搜索整個'人物'字典,將所有年齡爲42歲的人都歸還給我?
如果你想使用可以執行你可以使用像各種搜索更通用的功能:
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);
布朗特方法看起來是這樣的:
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)
您可以根據您的需要有個人的關鍵或不改變結果的格式。
將這樣的事情對你的工作:
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不存在於每個二級字典中。
+1生成器 – KobeJohn
如果您需要主鍵:
>>> [{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'}]
>>> [p for p in people if people[p]['age'] == 42]
['pk1']
不錯,簡潔,但如果你解釋爲什麼它是一種很好的方法來做事,這將是一個更好的答案。教最初的海報去釣魚,不要只給他們一份魚。 –
@JimDeLaHunt:好點,加了一個鏈接。 –
這裏的其他答案很好,應該做你所問。
我假設它來自數據庫,並且您不直接在數據庫中執行此查詢,因爲您需要對相同數據的不同角度?如果是這樣,您可以通過使用像SQLAlchemy這樣的智能系統獲得同樣有效的結果。如果你實際上不需要進行各種交互,我會建議直接從數據庫中獲取數據,因爲它們已經被用來高效地完成這種事情。
我正在閱讀來自XML文件的一堆測試結果。我從測試類,測試名稱等東西組成主要。然後,我需要做一些搜索,比如哪一個通過,哪些失敗。謝謝。 – dublintech
你想要什麼結果?包含與過濾器匹配的每個人的主鍵的列表?你是在尋找代碼來做一次搜索,或者尋找可以從代碼中的幾個地方調用的可重用函數? –