mems = {'member2': ['PCP1', 'PCP2'],
'member6': ['PCP1', 'PCP5'],
'member7': ['PCP2', 'PCP4', 'PCP5'],
'member9': ['PCP1', 'PCP5']}
provs = {'PCP1': 2, 'PCP2': 1, 'PCP4': 1, 'PCP5': 1}
Во-первых, вы можете повернуть mems
:
d1 = {}
for mem, pcps in mems.items():
for pcp in pcps:
d1.setdefault(pcp, []).append(mem)
# {'PCP1': ['member2', 'member6', 'member9'], 'PCP2': ['member2', 'member7'], 'PCP5': ['member6', 'member7', 'member9'], 'PCP4': ['member7']}
Теперь легко вычислить matches
: отфильтровать диктовку по len(mems)
и повернуть ее снова:
matches = {mems[0]: pcp for pcp, mems in d1.items() if len(mems) == 1}
# {'member7': 'PCP4'}
Вы можете создать new_mems
диктовку, которая не содержит соответствующий pcp
:
new_mems = {mem: [pcp for pcp in pcps if pcp not in matches.values()] for mem, pcps in mems.items()}
# {'member2': ['PCP1', 'PCP2'], 'member6': ['PCP1', 'PCP5'], 'member7': ['PCP2', 'PCP5'], 'member9': ['PCP1', 'PCP5']}
, а затем использовать счетчик для обновления provs
:
import collections
new_provs = collections.Counter(provs)
for mem, pcp in matches.items():
new_provs.update(mems[mem]) # add 1 to each count
new_provs[pcp] -= 2 # was 0 + 1 (line above) -> is 0
# Counter({'PCP1': 2, 'PCP2': 2, 'PCP5': 2, 'PCP4': 0})