Я пытаюсь зациклить существующий цикл for на как можно большем количестве итераций, чтобы мне не пришлось делать это вручную.Мой вложенный цикл сопоставляет врачей с больницами в соответствии с обоими предпочтениями.Здесь 1.0 в функции get относится к рангу 1.
Это то, что я до сих пор придумал (# в коде объясняет немного больше):
def hospital_ranking_of_doctor(hospital, doctor):
return ranking_by_hospitals2[hospital][doctor]
#free_doctors is currently a range (0,10)
for i in range(len(free_doctors)):
#Make a dictionary with name Round_(i+1) (To start at Round_1)
Round_(str(i+1)) = {}
#Start off with same values as last round, this action should not be performed in the first round
Round_(str(i+1)).update(Round_(str(i))
Round_(str(i+1))_values = list(Round_(str(i+1)).values())
for Doctor_ in ranking_by_doctors:
favored_hospital = ranking_by_doctors[Doctor_].get(1.0 + i) #Hospitals are ranked from 1.0 - 10.0, need 1.0 or would start at 0 and get error
favored_hospital_doctor = Doctor_
#If the hospital and doctor have not been assigned to a match before, assign the current hospital to the current doctor
if favored_hospital not in Round_(str(i+1)) and favored_hospital_doctor not in Round_(str(i+1))_values:
Round_(str(i+1))[favored_hospital] = Doctor_
#If the doctor has been assigned to a match before, continue with the next doctor
elif favored_hospital_doctor in Round_(str(i+1))_values:
continue
#If the hospital has been assigned to a match before, check if the previously assigned doctor is ranked higher (e.g 2.0 instead of 1.0)
#When this is indeed the case, the hospital prefers the new doctor over the old doctor, so assign the new doctor as its match
else:
previously_assigned_doctor = Round_(str(i+1))[favored_hospital]
if hospital_ranking_of_doctor(favored_hospital, previously_assigned_doctor) > hospital_ranking_of_doctor(favored_hospital, Doctor_):
Round_(str(i+1)[favored_hospital] = Doctor_
Matches['Round_'str(i+1)] = Round_(str(i+1))
Matches
free_doctors:
['Doctor_10', 'Doctor_6', 'Doctor_5', 'Doctor_9', 'Doctor_1', 'Doctor_4', 'Doctor_3', 'Doctor_7', 'Doctor_2', 'Doctor_8']
Вложенный цикл работает, но цикл по циклу вызывает синтаксические ошибки.Везде, где написано (str(i+1)
, я бы вручную записал число раньше в новом коде команды (поэтому 1 для раунда 1 с get(1.0)
и 2 для раунда 2 с get(2.0)
. Это выполнимо для набора данных из 10 врачей).и 10 больниц. Однако я хотел бы увеличить размер этого набора данных, а затем делать это вручную становится неприемлемым. Поэтому я хотел бы написать цикл, который автоматически делает это для меня, тогда словарь соответствий должен показать все десять раундов ссовпадения, достигнутые в этих раундах.
Даже лучше, чем использование range(len(free_doctors))
, было бы, если бы цикл просто продолжался до тех пор, пока не будут сопоставлены все врачи и больницы.