运行一次for循环

时间:2016-10-27 00:43:59

标签: python loops for-loop

我使用Python运行地下水模型  我的问题如下:

我有三个地下水模型存储在Model_Names [SLOW,MEDIUM,FAST]列表中  每个模型都有不同的属性和不同的模型名,即SLOW

我的脚本为特定于每个模型名称的模型生成输入文件

我正在运行三个系列模型,每个模型运行5次,总计15次运行  每次都会产生地下水位。

除了每个模型的第一次运行(设置了级别)之外,模拟的级别为  先前的模拟在下一次模拟中设置为起始级别。  即在SLOW(i)中的起始等级=在慢速(i-1)中的模拟等级

但是,我不想使用不同型号的模拟水平  即。我不希望在SLOW含水层模拟水平来通知MEDIUM含水层模拟。

所以我试着编写一个for循环来检查modelname是否等于以前的modelname  然后确定要使用的输入文件。

但是我在编写使用的代码时遇到问题,该代码指定了循环的先前迭代

我尝试了以下代码,我希望打印当前的模型名称并与

进行比较
for m, modelname in enumerate(Model_Name):
    print('Model Name = ' +modelname)

    if m!=0 and modelname == Model_Name[m-1]: 
    print ('** STARTING HEAD INPUT FILE UPDATED WITH HEADS FROM PREVIOUS SIMULATION') 

else:
    print('** STARTING HEAD INPUT FILE BUILT ')      

但它将modelname(i)与modelname(i-1)进行了三次比较,因为它循环了Model_Names的整个长度。
 我希望它只为每个模型运行检查一次modelnames(i)== modelnames(i-1),而不是循环整个Model_Names。有没有办法检查每个模型运行的模型名称而不通过Model_Names循环?

我也尝试过使用

while modelname == modelname[i-1]:

我找不到任何提及  我想做什么。

抱歉,我应该提到for循环嵌套在另一个for循环中:

Lag_times = [0.0000864, 0.000864, 0.00864]
Manage_Freq = [30, 183, 365, 730, 1825, 3650, 18250] 
Model_Name = ['SLOW', 'MEDIUM', 'FAST']       
# Loop through each model variable, build and run model
for i, j in zip (Lag_times, Model_Name):
    hk = i                           # set hydraulic conductivity
    modelname = j                                            
    for k in Manage_Freq:                          
        Freq = k                      
        # The code in here builds and runs model

然后我想检查模型运行的modelname是否等于之前的#modelname

if modelname !=0 and modelname == Model_Name[modelname-1]: 
              print (' STARTING HEAD INPUT FILE UPDATED WITH HEADS FROM PREVIOUS SIMULATION')     
 else:
              print('** STARTING HEAD INPUT FILE BUILT ')  

我认为我不需要遍历Model_Names,但我无法确定输入什么代码来检查modelname(i)== modelname(i-1)而不使用Model_Names。

1 个答案:

答案 0 :(得分:0)

我认为您对enumerate的行为感到有些困惑。你循环将运行三次。

(假设ModelNames==['Slow','Med','Fast']

  1. 第一次迭代。 m将为0,modelname将为' Slow'
  2. 第二次迭代。 m将为1,modelname将为' Med'
  3. 第3次迭代。 m将为2,modelname将为' Fast'
  4. 因此modelname == ModelNames[m-1]始终为True

    尝试写下你真正想做的事情,代码将自行编写:

    对于每个型号,您想要进行5次运行。第一次运行将有一些特殊的初始参数,但下一次运行将具有上一次运行的参数。

    您的代码看起来像这样:

    for model in ModelNames: # do something for each model
        params=None #initialize parameters to none meaning they're not set yet
        for i in range(5): #do 5 iterations
            if params is None: #have we gotten new starting parameters?
                params=get_initial_params(model) #figure out the ones for the first run
            output=run_simulation(model,params) #do your simulation
            params=get_next_params(output) #get the next parameters