<p>我想交叉引用字典和django queryset来确定哪些元素分别具有唯一的<code>dictionary['name']</code>和{<cd2>}值。我现在的做法是:</p>
<ul>
<li>创建字典['name']值的列表</li>
<li>创建列表djangmodel.name价值观</li>
<li>通过检查是否包含在这些列表中来生成唯一值列表</li>
</ul>
<p>如下所示:</p>
<pre><code>alldbTests = dbp.test_set.exclude(end_date__isnull=False) #django queryset
vctestNames = [vctest['name'] for vctest in vcdict['tests']] #from dictionary
dbtestNames = [dbtest.name for dbtest in alldbTests] #from django model
# Compare tests in protocol in fortytwo's db with protocol from vc
obsoleteTests = [dbtest for dbtest in alldbTests if dbtest.name not in vctestNames]
newTests = [vctest for vctest in vcdict if vctest['name'] not in dbtestNames]
</code></pre>
<p>必须生成中间的名称列表(上面的第2行和第3行),只是为了能够立即检查是否包含在其中,这让人感觉不太和谐。我有遗漏什么吗?我想我可以这样把两个列表理解放在一行中:</p>
^{pr2}$
<p>但这似乎很难理解。在</p>
<p><strong>编辑</strong>:
把初始状态想象成这样:</p>
<pre><code># vcdict is a list of django models where the following are all true
alldBTests[0].name == 'test1'
alldBTests[1].name == 'test2'
alldBTests[2].name == 'test4'
dict1 = {'name':'test1', 'status':'pass'}
dict2 = {'name':'test2', 'status':'pass'}
dict3 = {'name':'test5', 'status':'fail'}
vcdict = [dict1, dict2, dict3]
</code></pre>
<p>我不能转换成集合并取其不同之处,除非我将其分解为名称字符串,但是这样我就失去了对模型/字典其余部分的访问权,对吗?只有在这两种情况下都有相同类型的对象时,集合才会起作用。在</p>
<p>你在这里使用基本的集合运算。你可以把你的对象转换成集合,然后找到交集(想想维恩图):</p>
<pre><code>obsoleteTests = list(set([a.name for a in alldbTests]) - set(vctestNames))
</code></pre>
<hr/>
<p>在比较两个对象列表(pseudopython)时,集合非常有用:</p>
^{2}$