Python 搜索二维词典
我有一本代表人物的二维字典。下面是一个例子:Python 搜索二维词典,python,Python,我有一本代表人物的二维字典。下面是一个例子: >>> people = {'pk1':{'firstname':'Brian', 'age':42}, 'pk2':{'firstname':'Alex', 'age':50}} 可以看出,每个条目中都有一个主键。然后每个人都指向一本包含特定人信息的词典。我如何搜索整个“人物”词典以返回所有42岁的人 钝器法可能如下所示: def find_in_dict(d, criterion, lookup): result =
>>> people = {'pk1':{'firstname':'Brian', 'age':42}, 'pk2':{'firstname':'Alex',
'age':50}}
可以看出,每个条目中都有一个主键。然后每个人都指向一本包含特定人信息的词典。我如何搜索整个“人物”词典以返回所有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()
将允许您搜索密钥,即使该密钥不在每个辅助字典中。如果您需要主键:
>>> [{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'}]
使用一个
如果您想使用一个更通用的函数来执行各种搜索,您可以使用以下功能:
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 );
这里的其他答案都很好,应该按照你的要求去做
我假设它来自一个数据库,并且您没有直接在数据库中执行此查询,因为您需要对同一数据使用不同的角度?如果是这样的话,你可以通过使用智能系统获得同样有效的结果,比如。如果您实际上不需要进行各种交互,我建议您直接从数据库中获取数据,因为它们已经能够高效地完成这类工作。我正在从一个XML文件中读取大量测试结果。我从诸如测试类、测试名称之类的东西组成了主测试。然后,我需要进行搜索,以获取哪些通过,哪些失败。谢谢。很好,很简洁,但如果你解释一下为什么这是一种很好的做事方式,这将是一个更好的答案。教原创海报钓鱼,不要只给他们一份鱼。你想要什么结果?包含与筛选器匹配的每个人的主键的列表?您是在寻找一次性执行此搜索的代码,还是寻找可以从代码中的多个位置调用的可重用函数?
findPeople( people, lambda x: x['age'] == 42 );