在Python中,如何用另一个列表从一个列表中选择文件(可以使用循环或列表推导式吗)?
我有一个包含若干文件名的列表。下面给出一个示例:
clist[0:31]
['ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_exceedence_summary_2.0sd.csv',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_maxexceed.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_minexceed.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_monmax.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_monmean.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_monmin.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_monstd.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_monsum.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_sumexceedgt.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_sumexceedlt.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_tavg_monmean.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_tavg_monstd.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_thresh.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_tmax_exceed.nc',
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_tmin_exceedlt.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_exceedence_summary_2.0sd.csv',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_maxexceed.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_minexceed.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_monmax.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_monmean.nc'
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_monmin.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_monstd.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_monsum.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_sumexceedgt.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-074.LOCA_16thdeg_pr_sumexceedlt.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_tavg_monmean.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_tavg_monstd.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_thresh.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_tmax_exceed.nc',
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_tmin_exceedlt.nc']
对于每一个分组(模型、SSP和实现的唯一集合),我需要选取以 "tavg_monmean" 和 "pr_monsum" 结尾的文件,以在一个函数中使用。来自上面的 clist,这意味着会返回:
# first group's tavg_monmean and pr_monsum
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_tavg_monmean.nc'
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_monsum.nc'
# second group's tavg_monmean and pr_monsum
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_tavg_monmean.nc'
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_monsum.nc'
用于循环中的函数。一般来说,例如:
def little_function(tavg_monmean_input, pr_monsum_input):
<do stuff with inputs>
<loop to select from list and return>
tavg_monmean_input #one of the files ending in "tavg_monmean"
pr_monsum_input #file ending in "pr_monsum" from same group as tavg_monmean_input
little_function(tav_monmean_input, pr_monsum_input)
这些文件可以按模型、SSP和实现进行分组。举例来说,在上面的列表中,有两组这样的分组:
"ACCESS-CM2", "ssp245", and "r3i1p1f1".
"ACCESS-CM2", "ssp370", and "r1i1p1f1".
为了在各自的分组中保持输入的一一对应,我一直在尝试使用双层for循环或列表推导来创建选择,但总是把它搞乱。下面给出一个示例。
import re
# Create short list of unique model, SSP, realization
uqlis = [re.search("[A-Z].*\\.[0-9]{4}", i).group(0) for i in clist]
unqlis = set(uqlis)
unqlis = list(unqlis)
for i in range(len(unqlis)):
# subset of clist that matches one of the unique model, etc
clsub = [clist[li] for li in range(len(clist)) if unqlis[i] in clist[li]]
for j in range(len(clsub)):
---> ###1 Select the file from clsub that ends with tavg_monmean for
### the current group
if "tavg_monmean" in clsub[j]:
tam = clsub[j]
---> ###2 Select the file from clsub that ends with pr_monsum for the
### current group
elif "pr_monsum" in clsub[j]:
psm = clsub[j]
print(tam)
print(psm)
# provide the tam and psm (the tavg_monmean and pr_monsum variables) to the function
little_function(tam, psm)
预期结果:
在上面的代码块中,循环的第一轮中,###1 会选中:
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_tavg_monmean.nc'
并将其分配给 tam
而 ###2 将选中:
'ACCESS-CM2.ssp245.r3i1p1f1.2045-2074.LOCA_16thdeg_pr_monsum.nc'
并将其分配给 psm
因为它们是第一组(具有相同的模型、SSP和实现),并被发送到 little_function。
在第二轮中,###1 会选中:
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_tavg_monmean.nc'
并将其分配给 tam,以及
###2 将选中:
'ACCESS-CM2.ssp370.r1i1p1f1.2045-2074.LOCA_16thdeg_pr_monsum.nc'
将 psm 分配给它
在循环的每一次迭代中,tam 和 psm 都被发送到 little_function 进行处理。
如何为每个唯一分组(模型、SSP、实现)选择以 "tavg_monmean" 和 "pr_monsum" 结尾的文件,以便在 little_function 中读取和使用?
解决方案
我将创建一个字典,其键为唯一的模型、SSP和实现,值为相关的 tavg_monmean 和 pr_monsum 文件。
file_dict = {k: {'tam': None, 'psm': None} for k in uqlis}
for file in clist:
key = re.search("[A-Z].*\\.[0-9]{4}", file).group(0)
if "tavg_monmean" in file:
file_dict[key]['tam'] = file
elif "pr_sum" in file:
file_dict[key]['psm'] = file
for item in file_dict.values():
little_function(item['tam'], item['psm'])