【发布时间】:2019-03-10 05:35:26
【问题描述】:
假设我们必须在一次迭代中在列表推导中插入两个元素,但我们必须选择插入哪两个。我们如何进行这样的列表理解。
例如:-
假设我们有一个列表hostnames = ['aa', 'bb', 'dd', 'pp', 'bb', 'zz', 'hh']。
现在我们要修改这个列表,使得以 p 开头的主机名应该有一个名为“_prd”的额外元素(例如“pp_prd”),并且类似地,对于以 h 开头且值为“_uat”的主机名来说,还有一个额外的元素。(例如'hh_uat')。
因此,上述列表所需的输出将是mod_hostnames = ['aa', 'bb', 'dd', 'pp_prd', 'pp', 'bb', 'zz', 'hh_uat','hh']。
现在我想把它写成这样-
>>> 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
我们得到一个语法错误。我还知道,在列表推导中,第二个循环运行得更快(就像在 for 循环中一样),在我们的代码中,host in hostnames 运行得更快,而不是其他所需的方式。所以我尝试了这个:-
>>> mod_hostnames = [f(host) for host in hostnames for f in (fo,fp) if host[0]=='p' else for f in (fo,fh) if host[0]=='h' else for f in (fo)]
File "<stdin>", line 1
mod_hostnames = [f(host) for host in hostnames for f in (fo,fp) if host[0]=='p' else for f in (fo,fh) if host[0]=='h' else for f in (fo)]
^
SyntaxError: invalid syntax
有什么建议吗?或者这在列表推导中是不可能的。
我知道这根本不可读,并且有更好的方法可以将其写出来。 (例如,使用 dict 'switch' 在 for 循环中的一个语句中写入此内容,或者在循环中使用旧的 if else 等)。
发布解决方案编辑:收到了精彩的回复。谢谢!有人可以解释为什么我发布的代码也是错误的吗?
我觉得这是因为当条件为真或假时评估的语句只是解析为一个空的 for 循环:for f in (fo,fp) if host[0]=='p' else for f in (fo,fh) if host[0]=='p' 程序进入一个空的 for 循环 for f in (fo,fp)。它是否正确?
我认为将我的错误理解逆向工程到 for 循环中会解决这个问题。
【问题讨论】:
标签: python list for-loop if-statement list-comprehension