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 );