列表推导式使用疑问:复杂循环转换失败及转换可行性咨询
列表推导式优化问题及适用范围咨询
我尝试用列表推导式优化代码,已经成功把下面的简单循环转换成列表推导式:
# 旧写法 loaded_sounds = [] for i in assetList_text: if i.startswith("loaded_sound"): loaded_sounds.append(i.split(',')[1]) # 新写法 loaded_sounds = [i.split(',')[1] for i in assetList_text if i.startswith("loaded_sound")]
但在转换带有两个条件且包含去重逻辑的循环时,结果不符合预期:
原循环执行后输出长度为6:
gsc_files = [] for i in assetList_text: if ".gsc" in i: d = i.split(',')[-1].replace("\n", "") if d not in gsc_files: gsc_files.append(d)
而我写的对应列表推导式执行后输出长度为0:
gsc_files = [i.split(',')[-1].replace("\n", "") for i in assetList_text if ".gsc" in i if i.split(',')[-1].replace("\n", "") not in gsc_files]
我不知道问题出在哪里。另外,我想了解列表推导式的适用范围,请问下面两个循环能不能转换为列表推导式?
[1] 嵌套循环
weapon_files = [] x = join(f"{WAW_ROOT_DIR}/raw/weapons/sp") for path, subdirs, files in walk(x): for fileName in files: content = join(x, fileName) if content not in weapon_files: weapon_files.append(f"{WAW_ROOT_DIR}/raw/weapons/sp/{fileName}")
[2] 多分支条件循环
gsc_files_dir = [] for path in gsc_files: if f"{CURRENT_SELECTED_MOD.lower()}" in path: dir = join(f"{WAW_ROOT_DIR}/mods/{CURRENT_SELECTED_MOD}/{path}") gsc_files_dir.append(dir) elif os.path.exists(f"{WAW_ROOT_DIR}/mods/{CURRENT_SELECTED_MOD}/{path}"): dir = join(f"{WAW_ROOT_DIR}/mods/{CURRENT_SELECTED_MOD}/{path}") gsc_files_dir.append(dir) else: dir = join(f"{WAW_ROOT_DIR}/raw/{path}") gsc_files_dir.append(dir)
附:数据示例
assetList_text是读取自多个CSV文件的3000+行数据,部分含.gsc的行示例如下:
fx,weapon/shellejects/fx_smk_weapon_shell_eject fx,weapon/shellejects/fx_smk_weapon_shell_emit ... rawfile,maps/free_city.gsc ...
内容的提问来源于stack exchange,提问作者Phil Gibson
相关产品推荐
相关产品推荐

