【发布时间】:2017-01-15 20:17:10
【问题描述】:
我有这个项目列表,我想从最后一个项目开始逐个删除它,直到它达到预算的总价值 = 325.000
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)
Item-25(项目名称:“A12”)不能被删除,即使我们还有预算要删除,因为如果它被删除,将不再有代表区域“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)]
提前感谢您的帮助
【问题讨论】:
-
namedtuples 的一个好处是您可以使用 dot notation 访问属性,而不必使用索引 - 例如
i = Item(...); i.budget。 -
if counter_R_el >= 1 or counter_S_el >= 1:在我运行它时抛出 TypeError - 它试图将 Counter() 与 int() 进行比较 - 这是您的实际代码吗?
标签: python list conditional-statements