<p>用Python回答您的问题:递归地过滤每个选项的“单一过滤”结果,直到生成结果。为了使单个过滤器的大小写更合适,过滤器选项被重新组织以包含更多信息。你知道吗</p>
<p>但是当允许不同的操作类型时,它变得复杂了。这个问题并没有明确地提出这个问题,但需要超越第一个例子。允许在一组过滤器中使用多种操作类型的最简单的解决方案是一个类似于“开关”的构造,其中包含每个可能操作的函数,但“更好”的解决方案是从标准操作符库中传递操作符本身。你知道吗</p>
<pre><code># pokedex = ...
filter_options = [
{
'attribute': 'Attack',
'operator': '>=',
'value': 25,
},
{
'attribute': 'Defense',
'operator': '>=',
'value': 30,
},
{
'attribute': 'Type',
'operator': '==',
'value': 'Electric',
},
]
# Better to use: https://docs.python.org/2/library/operator.html
operators = {
'<': lambda a, b: a < b,
'>': lambda a, b: a > b,
'==': lambda a, b: a == b,
'<=': lambda a, b: a <= b,
'>=': lambda a, b: a >= b,
}
def filter_single(attribute, operator, value, pokedex=pokedex):
result = {}
for number, pokemon in pokedex.iteritems():
if operators[operator](pokemon[attribute], value):
result[number] = pokemon
return result
def filter(filter_options, pokedex=pokedex):
result = filter_single(
filter_options[0]['attribute'],
filter_options[0]['operator'],
filter_options[0]['value'],
pokedex,
)
for option in filter_options[1:]:
result = filter_single(
option['attribute'],
option['operator'],
option['value'],
result,
)
return result
print filter(filter_options)
</code></pre>
<p>这段代码是用Python3测试的,但应该可以用2.7。将<code>print</code>替换为<code>print()</code>,将<code>.iteritems()</code>替换为<code>.items()</code>以转换为Python3。你知道吗</p>
<hr/>
<p>对于结构化查询语言(SQL),这种类型的查询很容易考虑。连接数据结构和思维模式是SQL的目的之一。你知道吗</p>
<p>示例:</p>
<pre><code>SELECT * FROM pokedex
WHERE attack >= 25
AND defense >= 30
AND type == 'Electric';
</code></pre>
<hr/>
<p>另外,我认为问题的描述缺少了“pokers”变量似乎是所有pokemon可用的属性,但是如果假设过滤器选项总是有效的属性名,则不需要这样做。使用FilterOption类是强制执行有效筛选器的一种方法。你知道吗</p>