一个简单的计数器不能在 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)
我有两本词典:
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)