所以我决定开始使用列表理解,在谷歌了一下之后,我设法做到了这一点:

# 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

推荐答案

try 将两个IF语句替换为一个,并添加‘and’运算符而不是第二个‘if’.因为我不确定哪个2个‘if’在列表理解中行得通. 因此,请更改以下内容:

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]

对此:

gsc_files = [i.split(',')[-1].replace("\n", "") for i in assetList_text if (".gsc" in i) and (i.split(',')[-1].replace("\n", "") not in gsc_files)]

"Add"运算符应该比较正确的两个语句

我不知道怎么try 在列表理解中转换All for循环或只转换大部分代码这是个好主意,因为这会使您的代码难以阅读

Python相关问答推荐

剪切间隔以添加特定日期

mdates定位器在图表中显示不存在的时间间隔

为用户输入的整数查找根/幂整数对的Python练习

为什么dict. items()可以快速查找?

如何在Django模板中显示串行化器错误

Django.core.exceptions.SynchronousOnlyOperation您不能从异步上下文中调用它-请使用线程或SYNC_TO_ASYNC

上传文件并使用Panda打开时的Flask 问题

合并Pandas中的数据帧,但处理不存在的列

`Convert_time_zone`函数用于根据为极点中的每一行指定的时区检索值

IpyWidget Select 框未打开

PANDA:如何将多选列转换为索引/列

如何仅使用数据帧操作获得特定的唯一数据帧组合?

从pandas框架中删除重复的子框架

获取给出特定产品的所有可能组合的数量

盒子图分析

解析网站时无法得到正确答案

在Pandas 中通过GroupBy操作创建新列时出现KeyError

TypeError:无法实例化抽象模型(Django)

为什么我在解析pdf文件时会得到两组不同的坐标?

将MultiIndex列的级别转换为具有值的列(取消堆叠列)