我有一个项目清单,我想逐一删除从最后一个项目到第n个项目,直到它达到总预算值为325.000。
除了总价值之外,我还有其他两个条件来确定该物品是否应该移除。
首先,在删除该物品后,仍然至少保留一个在列表中表示相同地区的列表。
其次,在删除该物品后,仍然至少保留一个代表相同部门的物品。
例如,我可以删除最后一个项目,因为它代表区域“A”,并且还剩下5个代表区域“A”的项目。同时它代表部门“3”,还剩下3个代表部门“3”的项目。
这种删除和检查会重复进行,直到达到至少325,000的删除预算。
我写了这段代码,但我无法得到我需要的结果。请帮我纠正它。
这是我的代码得到的结果,item-25仍然被删除了,但它不应该被删除。
项目名称为“A12”的第25项即使我们还有预算可以削减也不能删除,因为如果删除它,就不会再有代表区域“A”的项目了,依此类推。
解决方案应该是:
谢谢您提前帮助。
from collections import namedtuple
Item = namedtuple('Item', 'region sector name budget target performance'.split())
sorted_KP = [Item(region='H', sector='2', name='H3', budget=7000.0, target=1.0, performance=4.0),
Item(region='H', sector='2', name='H10', budget=35000.0, target=15.0, performance=1.0),
Item(region='I', sector='2', name='I6', budget=50000.0, target=5.0, performance=0.40598931548848194),
Item(region='E', sector='4', name='E5', budget=75000.0, target=30.0, performance=0.0663966081766),
Item(region='C', sector='1', name='C1', budget=75000.0, target=50.0, performance=0.0308067750379),
Item(region='C', sector='1', name='C2', budget=75000.0, target=50.0, performance=0.0308067750379),
Item(region='C', sector='5', name='C4', budget=75000.0, target=50.0, performance=0.0308067750379),
Item(region='I', sector='2', name='I5', budget=100000.0, target=5.0, performance=0.40598931548848194),
Item(region='E', sector='4', name='E1', budget=100000.0, target=30.0, performance=0.0663966081766),
Item(region='D', sector='5', name='D21', budget=60000.0, target=4.0, performance=0.2479775110248),
Item(region='D', sector='5', name='D30', budget=10000.0, target=1.0, performance=0.1653183406832),
Item(region='D', sector='1', name='D23', budget=30000.0, target=20.0, performance=0.023659703723372342),
Item(region='C', sector='5', name='C3', budget=150000.0, target=75.0, performance=0.0308067750379),
Item(region='D', sector='5', name='D20', budget=30000.0, target=5.0, performance=0.0826591703416),
Item(region='H', sector='2', name='H6', budget=310576.0, target=1.0, performance=4.0),
Item(region='H', sector='3', name='H5', budget=9500.0, target=1.0, performance=0.1172008400616),
Item(region='E', sector='6', name='E3', budget=100000.0, target=30.0, performance=0.03747318294316411),
Item(region='G', sector='3', name='G17', budget=75000.0, target=20.0, performance=0.04132095963602382),
Item(region='C', sector='4', name='C5', budget=75000.0, target=25.0, performance=0.0308067750379),
Item(region='C', sector='2', name='C6', budget=30000.0, target=5.0, performance=0.0616135500758),
Item(region='C', sector='2', name='C7', budget=30000.0, target=5.0, performance=0.0616135500758),
Item(region='D', sector='6', name='D22', budget=65190.0, target=30.0, performance=0.020332158889648923),
Item(region='D', sector='5', name='D3', budget=100000.0, target=20.0, performance=0.0413295851708),
Item(region='D', sector='5', name='D4', budget=100000.0, target=20.0, performance=0.0413295851708),
Item(region='A', sector='1', name='A12', budget=25000.0, target=25.0, performance=0.00749432996938),
Item(region='A', sector='1', name='A13', budget=25000.0, target=25.0, performance=0.00749432996938),
Item(region='A', sector='3', name='A25', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='5', name='A26', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='1', name='A27', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='1', name='A29', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='3', name='A30', budget=4500.0, target=1.0, performance=0.02997731987752)]
除了总价值之外,我还有其他两个条件来确定该物品是否应该移除。
首先,在删除该物品后,仍然至少保留一个在列表中表示相同地区的列表。
其次,在删除该物品后,仍然至少保留一个代表相同部门的物品。
例如,我可以删除最后一个项目,因为它代表区域“A”,并且还剩下5个代表区域“A”的项目。同时它代表部门“3”,还剩下3个代表部门“3”的项目。
这种删除和检查会重复进行,直到达到至少325,000的删除预算。
我写了这段代码,但我无法得到我需要的结果。请帮我纠正它。
from collections import Counter
unpack = []
for item in sorted_KP:
item_budget = item[3]
sum_unpack = sum(item[3] for item in unpack)
budget = 325000
remaining = []
for item in sorted_KP:
if item not in unpack:
remaining.append(item)
region_el = [item[0] for item in remaining]
counter_R_el = Counter(region_el)
sector_el = [item[1] for item in remaining]
counter_S_el = Counter(sector_el)
if counter_R_el >= 1 or counter_S_el >= 1:
if sum_unpack <= budget:
unpack.append(item)
for item in unpack:
print "\t", item
这是我的代码得到的结果,item-25仍然被删除了,但它不应该被删除。
unpack =Item(region='A', sector='3', name='A30', budget=4500.0, target=1.0, performance=0.02997731987752)
Item(region='A', sector='1', name='A29', budget=4500.0, target=1.0, performance=0.02997731987752)
Item(region='A', sector='1', name='A27', budget=4500.0, target=1.0, performance=0.02997731987752)
Item(region='A', sector='5', name='A26', budget=4500.0, target=1.0, performance=0.02997731987752)
Item(region='A', sector='3', name='A25', budget=4500.0, target=1.0, performance=0.02997731987752)
Item(region='A', sector='1', name='A13', budget=25000.0, target=25.0, performance=0.00749432996938)
Item(region='A', sector='1', name='A12', budget=25000.0, target=25.0, performance=0.00749432996938)
Item(region='D', sector='5', name='D4', budget=100000.0, target=20.0, performance=0.0413295851708)
Item(region='D', sector='5', name='D3', budget=100000.0, target=20.0, performance=0.0413295851708)
Item(region='D', sector='6', name='D22', budget=65190.0, target=30.0, performance=0.020332158889648923)
项目名称为“A12”的第25项即使我们还有预算可以削减也不能删除,因为如果删除它,就不会再有代表区域“A”的项目了,依此类推。
解决方案应该是:
unpack = [Item(region='A', sector='3', name='A30', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='1', name='A29', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='1', name='A27', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='5', name='A26', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='3', name='A25', budget=4500.0, target=1.0, performance=0.02997731987752),
Item(region='A', sector='1', name='A13', budget=25000.0, target=25.0, performance=0.00749432996938),
Item(region='D', sector='5', name='D4', budget=100000.0, target=20.0, performance=0.0413295851708),
Item(region='D', sector='5', name='D3', budget=100000.0, target=20.0, performance=0.0413295851708),
Item(region='D', sector='6', name='D22', budget=65190.0, target=30.0, performance=0.020332158889648923),
Item(region='C', sector='2', name='C7', budget=30000.0, target=5.0, performance=0.0616135500758)]
谢谢您提前帮助。
i = Item(...); i.budget
。 - wwiiif counter_R_el >= 1 or counter_S_el >= 1:
当我运行它时会抛出 TypeError - 它正在尝试将 Counter() 与 int() 进行比较 - 这是你的实际代码吗? - wwii