查找内部字典是否包含特定时间间隔内的值

时间:2014-01-08 13:21:26

标签: python dictionary

我希望你的编码大师可以再次帮助我。

我有一个词典,其中我有一个内部词典和信息。这是一个例子:

    {
     'John': {'age': 27,'height': 181,'children': 2},
     'Jack': {'age': 33,'height': 203,'children': 1},
     'Carl': {'age': 52,'height': 162,'children': 3}
    }

然后我在内元组的元组中有一些标准,如下:

    (('age', 30, 60), ('height', 180, 220))

在内部元组中,第一个值是要检查的内容,然后是间隔中的最小值和最大值。我想要返回的是一个列出所有标准的人的列表,所以在上面的例子中,我们应该只有:

    ['Jack']

但我怎样才能以聪明和好的方式做到这一点?我正计划通过所有人,并为每个人检查该人是否符合标准。我尝试了以下方法:

    def findPerson(persons, criteria):
        for p in persons:
            for tuble in criteria:

但这似乎无处可去,因为p似乎只是人名,而不是整个条目,所以我回到原点。有人能帮助我吗?

5 个答案:

答案 0 :(得分:5)

你可以简单地使用列表理解和all功能,就像这样

d = {
     'John': {'age': 27,'height': 181,'children': 2},
     'Jack': {'age': 33,'height': 203,'children': 1},
     'Carl': {'age': 52,'height': 162,'children': 3}
    }
rules = (('age', 30, 60), ('height', 180, 220))
print [k for k, v in d.items() if all(s <= v[key] <= e for key, s, e in rules)]

<强>输出

['Jack']

相同的列表理解码,可以像这样写出

result = []
for k, v in d.items():
    for key, start, end in rules:
        if not (start <= v[key] <= end): break
    else:
        result.append(k)
print result

答案 1 :(得分:1)

>>> d = {
...      'John': {'age': 27,'height': 181,'children': 2},
...      'Jack': {'age': 33,'height': 203,'children': 1},
...      'Carl': {'age': 52,'height': 162,'children': 3}
...     }
>>> conds = (('age', 30, 60), ('height', 180, 220))
>>> [k for (k,v) in d.items() if all(cond[1] <= v[cond[0]] <= cond[2] for cond in conds)]
['Jack']

答案 2 :(得分:0)

这应该会帮助你:

def findPerson(persons, criteria):
    for person,properties in persons.items():
        for tuble in criteria:

答案 3 :(得分:0)

我认为你正在寻找:

for p in persons:
    passes = True
    for c in criteria:
        if persons[p][c[0]] < c[1] or persons[p][c[0]] < c[2]:
            passes = False
    if passes:
        print p

答案 4 :(得分:0)

from functools import partial
def dict_filter(values, obj):
    for key, val1, val2 in values:
        value = obj[1].get(key)
        if value is None or (value <= val1 or value >= val2):
            break
    else: 
        return True


d = {
    'John': {'age': 27,'height': 181,'children': 2}, 
    'Jack': {'age': 33,'height': 203,'children': 1},
    'Carl': {'age': 52,'height': 162,'children': 3}
}

conds = (('age', 30, 60), ('height', 180, 220))
persons = filter(partial(dict_filter, conds), d.iteritems())