Python列表理解和迭代

时间:2017-04-03 20:18:39

标签: python list python-3.x iteration

我得到了一个像'grid'这样设计的文件,如:

5,20,13
2,0,1,3,0
1,2,1,2,1
2,1,2,1,0
0,2,0,2,2
0,3,3,3,1

制作攻击模拟器。 并且第一行代表n(网格大小),p(每平方损失百分比),k(必须使其超过最后一行才能赢得的总数)。

我遇到的问题是模拟部分,我理解如何迭代代码行并进行数学编辑,例如:

numAP = numAttackPokemon
gridRules = gymData[0]    
gymGrid = gymData[1]      
n = gridRules[0]          
p = gridRules[1]
k = gridRules[2]          
numPRC = float(numAP/n) 
numPRCR = [numPRC] * n    

for numRow in range(0, n):
    gymGridNum = gymGrid[numRow]
    aList = []
    for num in gymGridNum:
        numDefSub = numPRCR[num] - gymGridNum[num]

        if numDefSub <= 0:
            print("You have failed, restart the program and try again!")
            break
        else:
            aList.append(numDefSub)

returns:
    [18.0, 20.0, 19.0, 17.0, 20.0]
    [19.0, 18.0, 19.0, 18.0, 19.0]
    [18.0, 19.0, 18.0, 19.0, 20.0]
    [20.0, 18.0, 20.0, 18.0, 18.0]
    [20.0, 17.0, 17.0, 17.0, 19.0]

从某种意义上说,这是正确的。但是我也必须为每个网格方格应用一个“随机”百分比丢失,这是我已经完成的(不是在那行代码中,删除它以预先计算这个问题)。我想说的是,我必须编辑此代码的第一行(扣除数量和百分比损失),然后在网格的其余部分使用该行重复数学。我对如何保留,编辑和使用网格中每一行的列表感到有些迷茫。

正确的输出是这样的,但没有随机百分比损失:(numPRC = 100)

[18.0, 20.0, 19.0, 17.0, 20.0]
[17.0, 18.0, 18.0, 15.0, 19.0]
[15.0, 17.0, 16.0, 14.0, 19.0]
[15.0, 15.0, 16.0, 12.0, 17.0]
[15.0, 12.0, 13.0,  9.0, 16.0]

我必须重复使用:

[18.0, 20.0, 19.0, 17.0, 20.0]

对于其余的行,但我不确定如何使用更新列表进行迭代。我相信这很简单,但我错过了一个小细节。

2 个答案:

答案 0 :(得分:0)

根据评论,我认为你需要的是这样的:

attackers = [ numAttackPokemon / n ] * n
lost_per_square = 1.00 - p / 100.0


for row in grid:
    for col, cost in enumerate(row):
        attackers[col] *= lost_per_square
        attackers[col] -= cost

这将构建攻击口袋妖怪的“行”,每列中的编号相同。然后它将迭代网格中的每一行,并且每行将遍历每一列,从攻击者行中的相应列中减去网格的“成本”。

此外,它还减去了“每平方损失”。我猜这就是这个意思,虽然我不确定。基本上,如果p = 20,那么每平方的损失将是-20%,因此乘数将是1.0 - 0.20 = 0.80。

请注意:这适用于因地形造成的任何损失之前的每平方损失。它甚至将这些损失应用到第一个方块。您可以更改订单,和/或跳过将损失应用到第一个或最后一个方格,具体取决于问题陈述。

答案 1 :(得分:0)

在此之上,Austin Hastings能够帮助解决我的问题。我必须编辑它以获得我想要的输出。代码如下:

numAP = numAttackPokemon  # Number of Mutant Pokemon they wish to attack with
gridRules = gymData[0]    # Rules such as n,p,k
gymGrid = gymData[1]      # Gym Array
n = gridRules[0]          # Size of grid
p = gridRules[1]          # Number of defending Pokemon
k = gridRules[2]          # Number of War-Pokemon that must pass

attPoke = [numAttackPokemon / n] * n   # Number of Pokemon Per-Column-Row, Float value
randPerc = np.random.randint(0, n)
lossPerSquare = randPerc / 100.0

for row in gymGrid:
    for col, cost in enumerate(row):
        attPoke[col] -= cost
        attPoke[col] = attPoke[col] - (attPoke[col] * lossPerSquare)

注意:变量“p”充当 0和n 之间的随机整数,以 lossPerSquare 为百分比。然后,总攻击口袋妖怪的最终结果是(攻击口袋妖怪 - 每平方成本) - (攻击宠物小精灵* lossPerSquare)。此外,成本确实需要在失去的百分比之前,我忘了提及。

谢谢。