遍历 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
标记为删除
- 在第二遍中,我们根据标记为删除的内容删除成员
我有 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
标记为删除 - 在第二遍中,我们根据标记为删除的内容删除成员