Python 3.x 用python编写多个嵌套for循环和if语句的好方法。

Python 3.x 用python编写多个嵌套for循环和if语句的好方法。,python-3.x,recursion,multiprocessing,nested-loops,Python 3.x,Recursion,Multiprocessing,Nested Loops,我试图读取“n”个目录/数据文件,从每个目录中读取7列,然后使用前面读取的7列中的某些列检查n*(n-1)“if”语句是否为真。如果条件为真,那么做一些数学运算,否则什么都不做 例如,如果我比较两个目录,那么我有2个“如果”语句要测试,如果我有3个目录,那么我有6个“如果”语句要检查 每个目录大约有10000行和40列,但它们的长度通常不同 目前,我有一个用于3个目录的工作代码,其中我将三个目录作为嵌套循环读取,并应用我的6个条件 下面是我的代码示例: path="xx" #Location o

我试图读取“n”个目录/数据文件,从每个目录中读取7列,然后使用前面读取的7列中的某些列检查n*(n-1)“if”语句是否为真。如果条件为真,那么做一些数学运算,否则什么都不做

例如,如果我比较两个目录,那么我有2个“如果”语句要测试,如果我有3个目录,那么我有6个“如果”语句要检查

每个目录大约有10000行和40列,但它们的长度通常不同

目前,我有一个用于3个目录的工作代码,其中我将三个目录作为嵌套循环读取,并应用我的6个条件

下面是我的代码示例:

path="xx" #Location of all input files.
cat1 = ascii.read(path + file3, guess=False)
data2 = fits.getdata(path+file2, 1)
cat2 = Table(data2)
cat3 = Table.read(path + 'xyz.tbl', format='ipac')




for i in range(len(cat1)):
    (ra1,dec1,flux1,flux1error,maj1,minor1,ang1)= (cat1['RA_Degrees'][i],
cat1['DEC_Degrees'][i],cat1['fitted_total_flux'][i],
cat1['fitted_total_flux_error'][i],cat1['BMajor_Degrees'][i],
cat1['BMinor_Degrees'][i],cat1['position_angle_deg'][i])
    ang1=ang1*np.pi/180



    for j in range(len(cat2)):
        (ra2,dec2,total_cat2,total_error_cat2,maj2,min2,pa2)= (cat2['ra'][j],cat2['dec'][j],
        cat2['total'][j],cat2['total_err'][j],
        cat2['BMajor'][j],cat2['Bminor'][j],cat2['Position Angle'][j]


        for k in range(len(cat3)):
            (ra3,dec3,total_cat2,total_error_cat2,maj3,min3,pa3)=(cat3['ra'][k],
            cat3['dec'][k],cat3['flux'][k],cat3['ferr'][k],cat3['bmaj'][k],
            cat3['bmin'][k],cat3['pa'][k])

            if np.all(

            np.all(np.abs(ra2-ra1)<  maj1+ maj2 and

            np.all(np.abs(dec2-dec1)< maj1 + maj2) and

            np.all(np.abs(ra3-ra2)<  maj2 + maj3) and

            np.all(np.abs(dec3-dec2)<  maj2 + maj3) and

            np.all(np.abs(ra3-ra1)<  maj1 + maj3) and

            np.all(np.abs(dec3-dec1)<  maj1 + maj3)

               ):
path=“xx”#所有输入文件的位置。
cat1=ascii.read(路径+文件3,猜测=False)
data2=fits.getdata(路径+文件2,1)
cat2=表格(数据2)
cat3=Table.read(路径+'xyz.tbl',格式='ipac')
对于范围内的i(len(cat1)):
(ra1,dec1,flux1,flux1error,maj1,minor1,ang1)=(cat1['RA_Degrees'][i],
第1类['DEC_Degrees'][i],第1类['fitted_total_flux'][i],
第1类[“装配的总通量误差”][i],第1类[“主要度数”][i],
cat1['BMinor_Degrees'][i],cat1['position_angle_deg'][i])
ang1=ang1*np.pi/180
对于范围内的j(len(cat2)):
(ra2,dec2,总类2,总类2,主要类2,min2,pa2)=(第2类['ra'][j],第2类['dec'][j],
第二类['total'][j],第二类['total_err'][j],
cat2['B主要'][j]、cat2['B主要'][j]、cat2['位置角][j]
对于范围内的k(len(cat3)):
(ra3,dec3,total_cat2,total_error_cat2,maj3,min3,pa3)=(cat3['ra'][k],
第三类['dec'][k]、第三类['flux'][k]、第三类['ferr'][k]、第三类['bmaj'][k],
第三类['bmin'][k],第三类['pa'][k])
如果np.all(
np.all(np.abs(ra2-ra1)
我有两个与此相关的问题:

  • 我想将其推广到任何数量的目录。目前,如果我有2,3,4个目录,我必须编辑代码,这很烦人
  • 执行2目录匹配最多需要33分钟,但3目录匹配代码目前已运行了2天。是否有任何方法加快此速度
  • 对于第一个问题,我在下面给出的链接中查找了递归函数,但我的问题是,我是否可以使用它,因为要检查的条件数也取决于“n”各目录中的列名通常不一致。例如:一个目录可能称为“RA”,另一个目录可能称为“RA”或“Right Asception”

    对于第二个问题,我尝试在文档之后使用多重处理


    我想知道如果我想进行多重处理或尝试使用递归函数,是否最好坚持使用嵌套for循环。任何建议都将不胜感激。

    查找itertools包。这将为您提供一些基本工具,以迭代列列表,并将列表长度指定为参数。是的,递归有助于解决组合数学,但这个包将为您处理递归开销

    这个应用程序的特定概念是7列的组合,一次取<强> n<强>。为了说明,我们考虑7列,每次取3列:总共有35个组合:7×6×5/3×2×1</p> 您将得到一个生成器,一个函数,它将按排序顺序返回35个组合中的每一个,每次返回一个。然后您可以像遍历列表一样遍历该组合。对于每个组合,遍历成对的列:

    for col_list in combo_gen:
        for right in range (1, n):
            r_col = col_list[right]
            for left in range(right):
                l_col = col_list[left]
                # Compare l_col and r_col
    
    这是这个过程的基本轮廓。你能从这里开始吗