<p>正如您所意识到的,您的方法效率很低,因为它必须搜索整个<code>ds</code>列表以查找每个筛选器的匹配项。前两个答案有一个类似的问题</p>
<p>在这些情况下,通过将其中一个列表转换为字典或集合,通常可以大大加快速度。这样,您只需扫描每个列表一次</p>
<ol>
<li>下面是一些简单的代码,如果每个make/模型只在<code>ds</code>中运行一次</李>
</ol>
<pre><code>dds = {(d['make'], d['model']): d for d in ds}
ds_filtered = [
dds[d['make'], d['model']]
for d in filters
]
</code></pre>
<ol start=“2”>
<li>如果在<code>ds</code>中可能有重复项,但在<code>filters</code>中没有重复项,则可以按如下方式切换:</li>
</ol>
<pre><code>fs = {(d['make'], d['model']) for d in filters}
ds_filtered = [
d
for d in ds
if (d['make'], d['model']) in fs
]
</code></pre>
<p>注意,第二个过滤器创建一个<code>set</code>来保存所有过滤器上的信息。与<code>list</code>不同,可以立即搜索它以测试<code>ds</code>中的每个项目(类似于<code>dict</code>查找)</p>
<ol start=“3”>
<li>如果在<code>ds</code>和<code>filters</code>中可能都有重复项,或者如果需要使用不同的筛选器列表重复多次,则需要创建一个查找字典,根据make和model对来自<code>ds</code>的多个元素进行分组。这有点复杂,但不太难:</li>
</ol>
<pre><code># make a dictionary with (make, model) as the key and
# a list of all matching items from `ds` as the value
dds = {}
for d in ds:
# add an empty list to the dictionary if needed,
# then append the current element
dds.setdefault((d['make'], d['model']), []).append(d)
# find all the elements that match each filter
ds_filtered = [
d
for f in filters
for d in dds[f['make'], f['model']]
# if some filters may not have matches, use this instead:
# for d in dds.get((f['make'], f['model']), [])
]
</code></pre>
<p>这里的任何解决方案都需要<code>len(ds) + len(filters)</code>步骤。其他解决方案需要<code>len(ds) * len(filters)</code>步骤</p>