一个简单的计数器不能在 python 中变为负值吗?

Can a simple counter not go negative in python?

我有两本词典:

members_singles = {'member3': ['PCP3'], 'member4': ['PCP1'], 'member11': ['PCP2'], 'member12': 
['PCP3'], 'member14': ['PCP4'], 'member15': ['PCP4'], 'member16': ['PCP4'], 'members17': ['PCP3']}

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

我想遍历 members 并且每次出现特定值时,从 providers

中的匹配计数倒数一个
to_remove_zero = []
pcps_in_negative = []
for member, provider_list in members_singles.items():
    provider = provider_list[0]
    if provider in providers:
        providers[provider] -= 1
        if providers[provider] == 0:
            to_remove_zero.append(provider)
        elif providers[provider] < 0:
            pcps_in_negative.append(provider)
        else:
            pass

我想将那些最终结果为零的提供者保存到一个列表中,并将那些结果为负数的提供者保存到另一个列表中。但是我的结果显示 to_remove_zero 包含 ['PCP3'、'PCP4'],尽管它们应该是负数。所以循环会在它们到达第二个条件之前将它们弹出。 python 像这样的简单计数器在倒数时会停在零还是我错过了什么?

这可能是因为您正在更改列表,同时希望索引保持一致:

a = [1,2,3]
a[0]
# 1
a.pop()
# 3
a[0]
# 1

providers 计数达到零时,您的代码会将提供商添加到 to_remove_zero 列表中。但是以后计数可能会变为负数,这会将同一提供者添加到 pcps_in_negative 列表中。那时,您的代码需要回溯并将其从 to_remove_zero 列表中删除:

providers[provider] -= 1
if providers[provider] == 0:
    to_remove_zero.append(provider)
elif providers[provider] < 0:
    pcps_in_negative.append(provider)
    # back-track
    if provider in to_remove_zero:
        to_remove_zero.remove(provider)

如果您使用集合,这可能会变得更整洁:

to_remove_zero = set()
pcps_in_negative = set()
for member, provider_list in members_singles.items():
    provider = provider_list[0]
    if provider in providers:
        providers[provider] -= 1
        if providers[provider] == 0:
            to_remove_zero.add(provider)
        elif providers[provider] < 0:
            pcps_in_negative.add(provider)
            to_remove_zero.discard(provider)