遍历 2 个字典,如果值出现在一个字典中,则倒数另一个字典中的 int 值,如果计数 = 0,则删除键

iterate through 2 dictionaries, if value occurs in one, count down the int value in other then remove key if count = 0

我有 2 个字典对象:

members = {'member3': ['PCP3'], 'member4': ['PCP1'], 'member11': ['PCP2'], 'member12': ['PCP3']}
providers = {'PCP1': 2, 'PCP2': 2, 'PCP3': 1, 'PCP4': 3, 'PCP5': 4}

我想遍历两者,每次出现 "members" 字典的值时,从该特定提供者的计数中减去一个。如果提供者的计数达到零,则将其从 "providers" 字典中删除,并从 "member" 字典中随机选择一个成员。所以在这种情况下,member3 或 member12 将被踢出,因为没有足够的位置。

如果 member3 赢得随机掷骰,结果将如下所示:

members = {'member3' : 'PCP3', 'member4': 'PCP1' , 'member11': PCP2}
providers = {'PCP1: 1, 'PCP2' : 1, 'PCP4': 3, 'PCP5' : 4}

我试过从这个开始,但这个问题超出了我的能力

from collections import defaultdict
query_dict=defaultdict(set)
for (k,v), (k2,v2) in zip(members_reduced.items(), PCPs.items()):
    query_dict[k[v]].subtract(k2[v2])

这给出了错误

TypeError: string indices must be integers

我也试过:

for (k,v), (k2,v2) in zip(members_reduced.items(), PCPs.items()):
if members_reduced[v] == PCPs[k2]:
    PCPs[v2] -= 1

有错误

TypeError: unhashable type: 'list'

如果第一部分正确,我不知道如何输入随机条件。这是我工作中需要的更大模型的更小模型

解决任务的一种方法是:

import random


members = {'member3': ['PCP3'], 'member4': ['PCP1'], 'member11': ['PCP2'], 'member12': ['PCP3']}
providers = {'PCP1': 2, 'PCP2': 2, 'PCP3': 1, 'PCP4': 3, 'PCP5': 4}


to_remove = []
for member, provider_list in members.items():
    provider = provider_list[0]
    if provider in providers:
        providers[provider] -= 1
        if providers[provider] == 0:
            providers.pop(provider)
            to_remove.append(provider)
for provider in to_remove:
    candidates = [
        member for member, provider_list in members.items()
        if provider == provider_list[0]]
    candidate = random.sample(candidates, 1)[0]
    members.pop(candidate)


print(members)
# {'member4': ['PCP1'], 'member11': ['PCP2'], 'member12': ['PCP3']}
print(providers)
# {'PCP1': 1, 'PCP2': 1, 'PCP4': 3, 'PCP5': 4}```

基本上,我们分两步解决问题:

  • 在第一遍中,我们修改了计数器,当计数器达到 0 时,我们将 member 标记为删除
  • 在第二遍中,我们根据标记为删除的内容删除成员