所以我决定开始使用列表理解,在谷歌了一下之后,我设法做到了这一点:
# old way
loaded_sounds = []
for i in assetList_text:
if i.startswith("loaded_sound"):
loaded_sounds.append(i.split(',')[1])
# new way
loaded_sounds = [i.split(',')[1] for i in assetList_text if i.startswith("loaded_sound")]
它的效果非常好. 所以我认为我将继续执行Hard for循环,这就是列表理解结果与for循环结果不匹配的地方.
所以这个转换有点难,因为它不仅有2个‘if’语句,而且实际上也没有附加索引.
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)
所以打印出来的是:6 但有了这一点:
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]
它打印输出:0 所以我不知道哪里出了问题?
此外,在谈到 list 理解的话题时,我想知道它们的广度. 以下2个for循环可以转换为列表理解吗?
[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)
向您致敬, 菲尔
编辑:回答《DialFrost》的问题:
f1 = join(f"{WAW_ROOT_DIR}/zone_source/english/assetlist/{CURRENT_SELECTED_MOD}.csv")
f2 = join(f"{WAW_ROOT_DIR}/zone_source/english/assetlist/{CURRENT_SELECTED_MOD}_patch.csv")
f3 = join(f"{WAW_ROOT_DIR}/zone_source/english/assetinfo/{CURRENT_SELECTED_MOD}.csv")
f4 = join(f"{WAW_ROOT_DIR}/zone_source/english/assetinfo/{CURRENT_SELECTED_MOD}_patch.csv")
with open(f1, 'r') as assetList, open(f2, 'r') as assetListPatch, open(f3, 'r') as assetInfo, open(f4, 'r') as assetInfoPatch:
assetList_text = assetList.readlines()
assetListPatch_text = assetListPatch.readlines()
assetInfo_text = assetInfo.readlines()
assetInfoPatch_text = assetInfoPatch.readlines()
AssetList_Text是一个大(3k+行)文件. 下面是assetList_Text中的一些信息,包括".gsc"行:
fx,weapon/shellejects/fx_smk_weapon_shell_eject
fx,weapon/shellejects/fx_smk_weapon_shell_emit
fx,weapon/shellejects/shotgun
fx,weapon/shellejects/shotgun_resting
fx,weapon/shellejects/shotgun_view
fx,weapon/shellejects/shotgun_view_blurred01
mptype,nazi_zombie_heroes
character,char_zomb_player_0
character,char_zomb_player_1
character,char_zomb_player_2
character,char_zomb_player_3
rawfile,animtrees/zombie_factory.atr
rawfile,clientscripts/_zombie_mode.csc
rawfile,clientscripts/createfx/dlc3_fx.csc
rawfile,clientscripts/createfx/free_city_fx.csc
rawfile,clientscripts/dlc3_code.csc
rawfile,clientscripts/dlc3_teleporter.csc
rawfile,clientscripts/free_city.csc
rawfile,clientscripts/free_city_amb.csc
rawfile,maps/createart/free_city_art.gsc
rawfile,maps/createfx/dlc3_fx.gsc
rawfile,maps/createfx/free_city_fx.gsc
rawfile,maps/dlc3_code.gsc
rawfile,maps/dlc3_teleporter.gsc
rawfile,maps/free_city.gsc
rawfile,rumble/flamethrower
rawfile,rumble/flamethrower_h.rmb
rawfile,rumble/flamethrower_l.rmb
rawfile,vision/zombie_factory.vision