Python循环未正确循环

时间:2019-02-24 07:43:24

标签: python python-3.x

我的循环被“假设”遍历列表,从[0]到最后一个项目,该项目最多为[7],然后购买并计算从列表中购买该项目的次数,然后乘以结果一个值。

它目前正在做的事情是购买少量物品,输出每次购买的次数,仅此而已。它甚至没有“花费”所有的“津贴”

https://pastebin.com/vSecjxA5

它通常输出

CP Total: 2000
Type Item: Item
# of Properties: 5
{'MDEF': 4}
{'SPR': 3}
{'AGI': 2}
{'CRIT': 3}
{}

如果您看到代码并将费用加在一起,最多最多只能增加100-200,而不会接近2000

for aProp in S:
    cost = CostDic[aProp]
    if (cost * 5) < CP:
        purchase_ls = []
        while CP >= cost:
            b = randint(1, 5)
            cost = cost * b
            if CP < cost:
                continue
            purchase_ls.append(aProp)
            CP = CP - cost
    else:
        purchase_ls = []
        while CP >= cost:
            cost = cost
            if CP < cost:
                continue
            purchase_ls.append(aProp)
            CP = CP - cost
    print(dict(Counter(purchase_ls)))

尤其是引起我悲伤的那部分

2 个答案:

答案 0 :(得分:0)

这是您的问题:

    while CP >= cost:
        b = randint(1, 5)
        cost = cost * b
        # More stuff follows...

在此循环中,您现在修改了cost的值,我想您不是故意这样做的。具体来说,我相信您在cost = cost * b行中的意图是,右侧的cost代表单个单位的成本,而左侧的cost代表“ n”个单位的费用,其中“ n”是1到5之间的随机数。

但是此代码实际上在做什么与该意图不同。第二次输入该while循环时,变量cost仍处于新的较高值,然后将再次乘以1-5。因此,cost会以这种速度迅速增长,以至于CP >= cost不能保持真实。

我认为让您大跌眼镜的是,您使用相同的变量cost来表示不同时间的不同事物。我强烈建议您将其更改为两个具有更有意义名称的变量,例如unitCostgroupCost,以防止稍后在代码中出现这种类型的混乱。

答案 1 :(得分:0)

对于有问题的循环,我现在将其修改为

for aProp in S:
    cost = CostDic[aProp]
    if (cost * 5) < CP:
        purchase_ls = []
        while CP >= cost:
            b = randint(1, 5)
            mcost = cost*b
            if CP < mcost:
                continue
            purchase_ls.append(aProp)
            CP = CP - mcost
    else:
        purchase_ls = []
        while CP >= cost:
            if CP < cost:
                continue
            purchase_ls.append(aProp)
            CP = CP - cost
    print(dict(Counter(purchase_ls)))

哪个循环部分很好,但它没有像我希望的那样正确地做两件事

  1. 未在列表中添加正确数量的追加,因为在循环的顶部购买时,它仅购买了1个aProp,便购买了其中的2个。
  2. 它不会循环浏览S清单以进行购买。它应该从[0]到最后一件(假设它有5件)[4],然后每件购买b次(除非它只能抓住一件),然后继续进行下一件,所以[0]投掷3,获得3次购买,然后移至[1],获得5次购买,然后移至...,最后击中[4],获得2次购买,然后如果仍有剩余CP,则返回再次从[0]-[4]中列出。