<p>您在<code>List1</code>中的第二个列表在索引2中没有值<code>'Configuration1'</code>,因此列表理解是空的。索引空列表会产生索引错误:</p>
<pre><code>>>> List1 = [[u'Case1', u'DP1', u'Configuration1', u'New'], [u'Case2', u'DP2', u'Configuration2', u'New']]
>>> List2 = [[u'DP1', u'EB1', u'Typ1'], [u'DP2', u'EB2', u'Type2'], [u'DP3', u'EB3', u'Type2']]
>>> item = List2[1]
>>> [x for x in List1 if x[1] == item[0] and x[2] == 'Configuration1']
[]
>>> [x for x in List1 if x[1] == item[0] and x[2] == 'Configuration1'][0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
</code></pre>
<p>更改后的语法无效;不能在列表理解<code>if</code>筛选器中使用<code>else</code>:</p>
^{pr2}$
<p>这是因为<code>if</code>部分是<em>不是</em>一个条件表达式,而是列表理解语法的一部分。<code>if</code>测试过滤元素。您可以在列表理解的左侧表达式中使用条件表达式,但在这里这样做没有意义。在</p>
<p>如果要查找匹配的数据,应将<code>List1</code>转换为字典:</p>
<pre><code>configuration_data = {(entry[1], entry[2]): entry[3] for entry in List1}
</code></pre>
<p>这将索引1和索引2处的项映射到索引3处的元素,这样您就可以简单地使用字典查找来填充<code>List2</code>的新列表对象:</p>
<pre><code>List2 = [[item[0], configuration_data.get((item[0], 'Configuration1'), None)]
for item in List2]
</code></pre>
<p>此列表理解的效果与使用enumerate处理<code>for</code>循环的效果相同;生成一个具有匹配配置数据的新列表:</p>
<pre><code>>>> List1 = [[u'Case1', u'DP1', u'Configuration1', u'New'], [u'Case2', u'DP2', u'Configuration2', u'New']]
>>> List2 = [[u'DP1', u'EB1', u'Typ1'], [u'DP2', u'EB2', u'Type2'], [u'DP3', u'EB3', u'Type2']]
>>> configuration_data = {(entry[1], entry[2]): entry[3] for entry in List1}
>>> [[item[0], configuration_data.get((item[0], 'Configuration1'), None)] for item in List2]
[[u'DP1', u'New'], [u'DP2', None], [u'DP3', None]]
</code></pre>