<p>如果要比较每个子列表中的多个元素,则无需展平列表:</p>
<pre><code>total = sum(sum(x) for x in cost)
cost_len = sum(len(x) for x in cost)
avg = total / cost_len
above = sum([sum([y > avg for y in x for x in cost])])
below = sum([sum([y < avg for y in x for x in cost])])
exact = cost_len - (above + below)
</code></pre>
<p>关于这个解决方案有两点:</p>
<ol>
<li><code>total</code>和<code>cost_len</code>的计算使用生成器,而不是根据结果创建列表。由于中间结果不需要额外的存储,因此这可以节省一些内存和可能的执行时间。你知道吗</li>
<li><code>above</code>和<code>below</code>是嵌套生成器,基本上相当于您尝试执行的嵌套循环。你知道吗</li>
</ol>
<p>下面是对最终嵌套循环的作用和修复方法的说明:</p>
<pre><code>for i in cost:
while index <= cost_len:
if i > avg:
above_avg+=1
elif i < avg:
below_avg +=1
index+=1
</code></pre>
<p><code>i</code>在<code>cost</code>的元素上循环,但是内部的<code>while</code>循环阻止它在处理<code>i</code>的第一个值之后执行任何操作。注意,<code>i</code>的值在内部循环中没有改变,因此第一个<code>i</code>的比较是反复进行的,其他的则完全没有,因为<code>index</code>到那时将是<code>cost_len + 1</code>。要保留现有的双循环结构,可以执行以下操作:</p>
<pre><code>for i in cost:
for j in i:
if j > avg:
above_avg+=1
elif j < avg:
below_avg +=1
</code></pre>
<p>在这一点上,您并不真正需要<code>index</code>。你知道吗</p>