擅长:python、mysql、java
<p>首先,你犯了一个小错误:应该是:</p>
<pre><code>[f(value) for value in x]
# ^ notice the `value`
</code></pre>
<p>而不是:</p>
<pre><code>[f(x) for value in x]
</code></pre>
<p>此外,重点是:</p>
<pre><code>return 2*x,x
</code></pre>
<p>简称:</p>
<pre><code>return (2*x,x)
</code></pre>
<p>所以<strong>一个元组。因此,您的列表理解会生成一个元组列表,而不是一个列表元组。但是<code>zip</code>的好处是,您可以很容易地将它与星号反向使用:</p>
<pre><code>xlist,ylist = <b>zip(*</b>[f(value) for value in x]<b>)</b>
# ^ with asterisk</code></pre>
<p>注意<code>xlist</code>和<code>ylist</code>将是<strong>元组</strong>(因为<code>zip</code>将被解包)。如果希望它们是列表,例如,可以使用:</p>
<pre><code>xlist,ylist = <b>map(list,</b>zip(*[f(value) for value in x])<b>)</b></code></pre>
<p>结果是:</p>
<pre><code>>>> xlist
[0, 2, 4]
>>> ylist
[0, 1, 4]
</code></pre>
<p>(注意<code>range</code>s从0开始计数)</p>
<p><strong>替代方法:另一种方法当然是:</p>
<pre><code>xlist = [f(value)[0] for value in x]
ylist = [f(value)[1] for value in x]
</code></pre>
<p>但这当然是<em>不雅的</em>而且可能是低效的(因为<code>f</code>在计算上是昂贵的)。</p>