gpt4 book ai didi

Python有条件地在列表理解中的一次迭代中插入多个元素

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:59 24 4
gpt4 key购买 nike

假设我们必须在一次迭代中在列表理解中插入两个元素,但我们必须选择插入哪两个元素。我们如何进行这样的列表理解。

例如:-假设我们有一个列表 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 ) 如果 host[0]=='p' 程序进入空循环 for f in (fo,fp)。它是否正确?
我认为,将我的错误理解逆向工程到 for 循环中可以解决这个问题。

最佳答案

首先你需要编写一个总是返回元组的转换函数,必要时使用单例元组:

def transform(name):
if name.startswith("p"):
return (name + "_prd", name)
if name.startswith("h"):
return (name + "_uat", name)
return (name,) # Singleton tuple.

然后你可以这样做:

import itertools
mod_hostnames = list(itertools.chain.from_iterable(
transform(name) for name in hostnames))
print(mod_hostnames)

itertools.chain.from_iterable 本质上是一个扁平化操作,它连接所有中间元组,而外部 list 将该生成器的输出转换为实际列表。

但是,在这种情况下,使用传统的 for 循环的更简单的方法更有意义。

关于Python有条件地在列表理解中的一次迭代中插入多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52653278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com