Это, наверное, простой вопрос, но он сводит меня с ума! У меня есть код Python, который выполняет клеточные автоматы на сетке землепользования. Я сделал словарь идентификатора ячейки: код землепользования, импортированный из текстового файла. У меня также есть импорт соседних соседей каждой ячейки из текстового файла. Для каждой ячейки во вложенном цикле я выбираю наибольшее значение, подсчитываю наибольшее значение соседних ячеек. Если это значение больше, чем у обрабатывающей ячейки и встречалось более 4 раз, я обновляю словарь для этого идентификатора ячейки. Коды землепользования ранжируются по приоритету. В приведенном ниже коде вы увидите <6 ... 6 - это вода и водно-болотные угодья, которые я не хочу менять. В первый раз, когда я запустил код, 7509 ячеек изменили землепользование в зависимости от использования земли соседними соседями. Я могу закомментировать чтение текстового файла словаря и запустить его снова, затем изменилось около 5000 ячеек. Запустите его снова, затем еще меньше и так далее. То, что я хотел бы сделать, это запустить это в цикле, пока только 0,0001 от общего числа ячеек не изменится, после этого разорвать цикл. </p>
Я несколько раз пытался использовать итераторы, такие как «для r в диапазоне (999) - что-то большое; если End_Sim> count: break». Но он ломается после первого, потому что счетчик возвращается к нулю. Я попытался поместить счетчик = 0 в цикл, и он складывается ... Я хочу, чтобы он начинался заново каждый раз, чтобы число ячеек становилось все меньше и меньше. Я пень ... надеюсь, это кому-то тривиально!
Вот мой код (это чистый лист ... Я удалил свои неудачные попытки создать цикл количества симуляций):
import sys, string, csv
#Creating a dictionary of FID: LU_Codes from external txt file
text_file = open("H:\SWAT\NC\FID_Whole_Copy.txt", "rb")
#Lines = text_file.readlines()
FID_GC_dict = dict()
reader = csv.reader(text_file, delimiter='\t')
for line in reader:
FID_GC_dict[line[0]] = int(line[1])
text_file.close()
#Importing neighbor list file for each FID value
Neighbors_file = open("H:\SWAT\NC\Pro_NL_Copy.txt","rb")
Entries = Neighbors_file.readlines()
Neighbors_file.close()
Neighbors_List = map(string.split, Entries)
#print Neighbors_List
#creates a list of the current FID
FID = [x[0] for x in Neighbors_List]
#Calculate when to end of one sweep
Tot_Cells = len(FID)
End_Sim = int(0.0001*Tot_Cells)
gridList = []
for nlist in Neighbors_List:
row = []
for item in nlist:
row.append(FID_GC_dict[item])
gridList.append(row)
#print gridList
#Performs cellular automata rules on land use grid codes
i = iter(FID)
count = 0
for glist in gridList:
Cur_FID = i.next()
Cur_GC = glist[0]
glist.sort()
lr_Value = glist[-1]
if lr_Value < 6:
tie_LR = glist.count(lr_Value)
if tie_LR >= 4 and lr_Value > Cur_GC:
FID_GC_dict[Cur_FID] = lr_Value
#print "The updated gridcode for FID ", Cur_FID, "is ", FID_GC_dict[Cur_FID]
count += 1
print count
Спасибо за любую помощь!