回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>假设我们必须在一次迭代中在一个列表理解中插入两个元素,但是我们必须选择插入哪两个元素。我们如何才能做出这样的清单理解。在</p>
<p>为示例:-
假设我们有一个列表<code>hostnames = ['aa', 'bb', 'dd', 'pp', 'bb', 'zz', 'hh']</code>。在</p>
<p>现在我们要修改这个列表,使以p开头的主机名应该有一个名为“_prd”(例如“pp_prd”)的额外元素,对于以h开头、值为“_uat”的主机名也应该有一个额外的元素(例如“hh_uat”)。在</p>
<p>所以上面列表的期望输出是<code>mod_hostnames = ['aa', 'bb', 'dd', 'pp_prd', 'pp', 'bb', 'zz', 'hh_uat','hh']</code>。在</p>
<p>现在我想这样写-</p>
<pre><code>>>> fh=lambda x: x+'_uat'
>>> fp=lambda x:x+'_prd'
>>> fo=lambda x:x
>>> lis
['aa', 'bb', 'dd', 'pp', 'bb', 'zz', 'hh']
>>> hostnames = lis
>>> mod_hostnames = [f(host) for f in (fo,fp) if host[0]=='p' else f(host) for f in (fo,fh) if host[0]=='h' else host for host in hostnames]
File "<stdin>", line 1
mod_hostnames = [f(host) for f in (fo,fp) if host[0]=='p' else f(host) for f in (fo,fh) if host[0]=='h' else host for host in hostnames]
^
SyntaxError: invalid syntax
</code></pre>
<p>我们得到一个语法错误。我还知道在列表理解中,第二个循环运行得更快(就像for循环一样),而在我们的代码中,<code>host in hostnames</code>运行得更快,而不是另一种所需的方式。所以我试了一下:</p>
^{pr2}$
<p>有什么建议吗?或者这在列表理解中是不可能的。<br/>我知道这根本不可读,有更好的方法来写出来。(例如使用dict“switch”在for循环中的一个语句中写入此语句,或者在循环中使用旧的if-else语句,等等)。在</p>
<p>后解决方案编辑:收到了精彩的答复。谢谢!有人能解释一下为什么我发布的代码也是错误的吗?<br/>
我觉得这是因为当condition为true或false时计算的语句只会解析为一个空的for循环:<code>for f in (fo,fp) if host[0]=='p' else for f in (fo,fh)</code>如果host[0]=='p',程序将进入一个空的for循环<code>for f in (fo,fp)</code>。这是对的吗?<br/>
我想,把我错误的理解力逆向工程到for循环中,我想可以澄清这一点。在</p>