简单Python代码不理解

一个投骰子的游戏,投五次,对应得分如下
1,1,1 => 1000 points
6,6,6 => 600 points
5,5,5 => 500 points
4,4,4 => 400 points
3,3,3 => 300 points
2,2,2 => 200 points
1 => 100 points
5 => 50 point

Throw       Score
 ---------   ------------------------------------------------
 5 1 3 4 1   250:  50 (for the 5) + 2 * 100 (for the 1s)
 1 1 1 3 1   1100: 1000 (for three 1s) + 100 (for the other 1)
 2 4 4 5 4   450:  400 (for three 4s) + 50 (for the 5)

第二个for循环不理解

def score(dice):
    sum = 0
    counter = [0, 0, 0, 0, 0, 0]
    points = [1000, 200, 300, 400, 500, 600]
    extra = [100, 0, 0, 0, 50, 0]
    for die in dice:
        counter[die - 1] += 1
    for (i, count) in enumerate(counter):
        sum += (points[i] if count >= 3 else 0) + extra[i] * (count % 3)
    return sum
print(score([5, 1, 3, 4, 1]))

积分规则有两条:一是按出现3次的数字积不同的分,二是按刨除前三个数字后剩下的1或5积不同的分。
这个函数设计了3个列表,counter储存1-6的出现次数(但由于数组从0开始所以是0-5),point储存1-6对应的规则一得分,extra储存对应的规则二得分。
所以怎么算总分呢:规则一很好办,counter对应的哪一位数字次数>=3,就把该数字下标对应的分数加到sum里。规则二是难点也是代码的精髓,投5次骰子,3次以上计分,1或5不满3次按次数计分,满3次就减去3再计分。这种不满3取原值,满3减3再取值的行为和模3运算(即除3取余)是等价的(哪怕把规则扩展到更多次骰子,只要一次骰子只计分一次,这种模运算仍然可以起效)
所以第二个表达式就很明显了,enumerate(counter)会为列表counter生成(index,counter)元组组成的可迭代对象,这样遍历出来就可以利用index来访问和counter对应的数字的point和extra的分数,(points[i] if count >= 3 else 0) 就是计算次数为3的数字的分数,extra[i] * (count % 3)就是计算剩余的1和5的分数

第一个循环
根据输入得出新的counter
第二个循环
根据第一个循环后counter结果
计算sum += (points[i] if count >= 3 else 0) + extra[i] * (count % 3)