我希望你的编码大师可以再次帮助我。
我有一个词典,其中我有一个内部词典和信息。这是一个例子:
{
'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似乎只是人名,而不是整个条目,所以我回到原点。有人能帮助我吗?
答案 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())