<p>正如g.d.d.c所提到的,列表理解并不总是有利的。在这种情况下,它将具有更好的性能,因为您将避免在每次迭代中调用<code>append</code>,如<a href="https://stackoverflow.com/a/16907417/6692898">this answer</a>所述。如果你充分利用缩进,你仍然可以很容易地理解列表</p>
<p>唯一的问题是,不能从列表理解返回两个不同的列表,最接近的方法是返回带有<code>(poi, nh)</code>对的单个列表,其中<code>poi</code>和<code>nh</code>是列表</p>
<p>另一个在你的问题中不清楚的考虑是,你是否想<code>append</code>或<code>extend</code>每个列表</p>
<ul>
<li>追加将产生一个列表列表,在某些用例中很有用,在这种情况下,您可以通过构建列表理解来提高性能</李>
<li>如果您只关心所有元素,而不考虑源,那么扩展将导致一个平面列表。在这种情况下,如果数据的大小介于中到小之间,最好保持循环的原样,避免进一步分离元组(见下文)</li>
</ul>
<p>不管怎样,这是一份清单。您可以首先看出它基本上是最内部的代码,然后依次是所有的<code>for</code>和<code>if</code></p>
<pre><code>main_list = [
(
[x['normalized_name'] for x in value['poiSet']]
if value['paramName'] == 'distFrom' else []
,
[y['label'] for y in value['choices']]
if value['paramName'] == 'znf' else []
)
for entry in tr_poi_nh['pageManifest']['hydrations']
if entry['package'] == 'e374ol'
for value in entry['props']['initialAvailableFilters']
]
</code></pre>
<p>我会考虑从这里开始哪一个最简单,或者使用<code>main_list</code>原样并修改进一步的代码,或者将元组分为两个列表</p>
<p>如果必须将<code>poi</code>和<code>nh</code>作为两个单独的列表,那么现在需要两个列表理解</p>
<pre><code># to have lists of lists
poi = [x[0] for x in main_list]
nh = [x[1] for x in main_list]
# OR
# to have flat lists
poi = [e for x in main_list for e in x[0]]
nh = [e for x in main_list for e in x[1]]
</code></pre>