Создание самоинкрементной функции - PullRequest
0 голосов
/ 09 февраля 2020

Скажем, у меня есть два объекта словаря, таких как:

members = {"member1" : ["PCP1", "PCP2", "PCP3"],
          "member2": ["PCP1", "PCP2", "PCP3"],
          "member3": ["PCP1", "PCP2", "PCP3"],
          "member4": ["PCP1", "PCP2", "PCP4"],
          "member5": ["PCP1", "PCP3", "PCP4"]}

providers = {"PCP1": 2, "PCP2": 1, "PCP3": 2, "PCP4": 1}

Я создал функцию, которая подсчитывает расхождения между запрошенными подсчетами для каждого провайдера (PCP) и фактическими слотами, доступными для каждого, как видно из providers. Функция, которую я должен публиковать здесь, слишком длинная, более 50 строк, чтобы публиковать здесь, но в основном она смотрит на несоответствие и, если она есть, создает sample_counter и использует ее для случайной выборки одного из членов из списка членов. для этого провайдеры. Он должен начинаться со случая, когда есть одно несоответствие, например, с «PCP4», только два members запросили его / ее, поэтому функция будет выбирать между двумя из них и выбирать один, добавлять в словарь совпадений и удалять их от members и этого "PCP4" от providers, так как они теперь заполнены. Затем для этого члена, который был выбран из случайного выбора, они остаются в members, но теперь их список PCP содержит только других поставщиков, поскольку «PCP4» был удален из их списка выбора.

Результат будет выглядеть например, если «member4» не был выбран из random.sample и, таким образом, был найден и теперь находится вне пула:

members = {"member1" : ["PCP1", "PCP2", "PCP3"],
          "member2": ["PCP1", "PCP2", "PCP3"],
          "member3": ["PCP1", "PCP2", "PCP3"],,
          "member5": ["PCP1", "PCP3"]}

providers = {"PCP1": 2, "PCP2": 1, "PCP3": 2}

matches = {"member4" : "PCP4"}

Я создал функцию, которой я поделюсь, если потребуется, это делает случайный выбор, когда есть только одно несоответствие между счетами и, таким образом, только 1 выборка, но я хочу что-то, где оно продолжает расти, например, выбор двух, где разница равна двум, и так далее. Я мог бы написать одну и ту же функцию в основном снова и снова, просто выполнив 2, а затем 3, 4 и т. Д., Пока в members не останется больше «членов». но мне было интересно, есть ли более эффективный способ сделать это.

1 Ответ

1 голос
/ 09 февраля 2020

Это может сильно помочь, если вы опубликуете свою функцию, но с информацией, которую вы даете, я думаю, что решение может быть:

Допустим, вы используете функцию: difference_function И два словаря, которые вы подробно описали: параметры для этой функции.

Тогда вы можете просто перебрать словарь: members.items() и сохранить в другом словаре расхождение для каждого ключа members. Затем просто выполните итерацию по списку: [1, 2, .... size(members)] и используйте каждый столбец этого списка в качестве ключа для словаря расхождений.

В python коде, который может быть (не уверен в размере / длине диктата):

dict_discrepancies={}
for key, el in members.items():
    dict_discrepancies[difference_function(el)]=key

#To access to the different discrepancies by order
for i in range(0, len(members)):
    #This is the member with i discrepancy
    members[dict_discrepancies[i]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...