我有一个代表人的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 :(得分: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'}]
答案 2 :(得分:4)
>>> [p for p in people if people[p]['age'] == 42]
['pk1']
答案 3 :(得分: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()
也可以搜索密钥。
答案 4 :(得分:1)
Blunt方法可能如下所示:
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)
您可以根据是否需要拥有此人的密钥来更改结果格式。
答案 5 :(得分:1)
这里的其他答案非常好,应该按照你的要求做。
我假设它来自数据库,并且您没有直接在数据库中执行此查询,因为您需要对相同数据使用不同的角度?如果是这样,您可以通过使用SQLAlchemy等智能系统获得同样有效的结果。如果您实际上不需要进行各种交互,我建议您直接从数据库中获取数据,因为它们已经有效地完成了这类工作。