搜索2维字典

时间:2012-01-24 13:30:02

标签: python

我有一个代表人的2维字典。这是一个例子:

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

可以看出,每个条目都有一个主键。然后每个人都指向一个包含特定人物信息的字典。如何搜索整个“人物”字典,以便将所有年龄为42岁的人归还给我?

6 个答案:

答案 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)

使用list comprehension

>>> [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等智能系统获得同样有效的结果。如果您实际上不需要进行各种交互,我建议您直接从数据库中获取数据,因为它们已经有效地完成了这类工作。