<p>你的条件<code>(item[0] and item[2:4])==(item[0] and item2[2:4])</code>是错误的。你知道吗</p>
<p>除了第二个<code>item[0]</code>应该是<code>item2[0]</code>之外,<code>(item[0] and item[2:4])</code>所做的是(类似于<code>(item2[0] and item2[2:4])</code>):</p>
<ul>
<li>如果<code>item[0]</code>是<code>0</code>,则返回<code>item[0]</code>本身,即<code>0</code></li>
<li>如果<code>item[0]</code>不是<code>0</code>,则返回<code>item[2:4]</code>是什么</li>
</ul>
<p>然后和第二项的结果进行比较。因此,<code>[0,1,1,1]</code>将“等于”<code>[0,2,2,2]</code>,<code>[1,1,1,1]</code>将“等于”<code>[2,1,1,1]</code>。你知道吗</p>
<p>尝试改用<code>tuples</code>:</p>
<pre><code>if (item[0], item[2:4]) == (item2[0], item2[2:4]):
</code></pre>
<p>或者按照另一个答案的建议使用<code>operator.itemgetter</code>。你知道吗</p>
<hr/>
<p>为了加速两个列表中项目的成对匹配,可以将第一个列表中的项目放入字典,使用这些元组作为键,然后遍历另一个列表并在字典中查找匹配的项目。复杂性将是<em>O(n+m)</em>而不是<em>O(n*m)</em>(<em>n</em>和<em>m</em>是列表的长度)。你知道吗</p>
<pre><code>key = operator.itemgetter(0, 2, 3)
list1_dict = {}
for item in list1:
list1_dict.setdefault(key(item), []).append(item)
for item2 in list2:
for item in list1_dict.get(key(item2), []):
newlist1.append(item)
newlist2.append(item2)
</code></pre>