在Python中,如何用另一个列表从一个列表中选择文件(可以使用循环或列表推导式吗)?

编程语言 2026-07-09

我有一个包含若干文件名的列表。下面给出一个示例:

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 分配给它

在循环的每一次迭代中,tampsm 都被发送到 little_function 进行处理。

如何为每个唯一分组(模型、SSP、实现)选择以 "tavg_monmean" 和 "pr_monsum" 结尾的文件,以便在 little_function 中读取和使用?

解决方案

我将创建一个字典,其键为唯一的模型、SSP和实现,值为相关的 tavg_monmeanpr_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'])
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章