Как правильно написать цикл для внутри другого цикла в Python? - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь зациклить существующий цикл 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)), было бы, если бы цикл просто продолжался до тех пор, пока не будут сопоставлены все врачи и больницы.

1 Ответ

0 голосов
/ 29 января 2019

Похоже, вы пытаетесь решить проблему "стабильного брака".Вместо того, чтобы мужья и жены были не в состоянии «обменяться», у вас есть врачи и больницы, но структура та же: студенты, школы и т. Д.

https://gist.github.com/joyrexus/9967709 - первый хит Google для "Stable Marriage" Python и он, вероятно, будет делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...