如何用列表推导式重构Python三层嵌套循环代码?
用列表推导式重构三层嵌套循环
原代码的核心是生成l_ids、l_years、l_means的笛卡尔积,同时为每个组合生成随机能量值。以下是两种用列表推导式实现的方案:
方案1:先生成元组列表再拆分
先一次性生成所有组合的元组,再拆分到四个列表,这种方式只遍历笛卡尔积一次,性能更优:
import random l_ids = ["0000000","0000010","0000020","0000030","0000040","0000050","0000060","0000070","0000080","0000090","0000100", "0000110","0000120","0000130","0000140","0000150"] l_years = [2018,2019,2020,2021,2022] l_means = ["car","train","plane","other","freight"] # 生成包含所有组合与随机值的元组列表 combined = [ (supp_id, year, mean, random.randint(100000000, 999999999)) for supp_id in l_ids for year in l_years for mean in l_means ] # 拆分元组到四个列表(zip返回元组,按需转成列表) l_id, l_year, l_mean, l_energy = zip(*combined) l_id = list(l_id) l_year = list(l_year) l_mean = list(l_mean) l_energy = list(l_energy)
方案2:单独为每个列表写推导式
直接对应原循环逻辑,为每个列表编写独立的推导式,结构更贴近原代码:
import random l_ids = ["0000000","0000010","0000020","0000030","0000040","0000050","0000060","0000070","0000080","0000090","0000100", "0000110","0000120","0000130","0000140","0000150"] l_years = [2018,2019,2020,2021,2022] l_means = ["car","train","plane","other","freight"] l_id = [supp_id for supp_id in l_ids for year in l_years for mean in l_means] l_year = [year for supp_id in l_ids for year in l_years for mean in l_means] l_mean = [mean for supp_id in l_ids for year in l_years for mean in l_means] l_energy = [random.randint(100000000, 999999999) for supp_id in l_ids for year in l_years for mean in l_means]
说明
两种方案都完全复刻原三层循环的行为:random.randint在推导式中每次调用都会生成新的随机数,和原代码逻辑一致。如果处理的列表规模较大,优先选方案1,减少遍历次数。
内容的提问来源于stack exchange,提问作者mouad Et-tali
相关产品推荐
相关产品推荐

