如何总结列表中某些值的值?

时间:2014-11-26 08:09:57

标签: python list dictionary sum

我在Yatzee中有一个协议,包含列表中每个玩家的e dict对象,称为协议。

我正在寻找一种方法来对dict中的一些值求和? 每个词都有这些时刻:

Ettor
Tvåor
Treor
Fyror
Femmor
Sexor
Summa
Bonus
Par
Tvåpar
Triss
Fyrtal
Stege(liten)
Stege(stor)
Kåk
Chans
Yatzy
Summa

连接到一个值。我想总结前6和后来的总和除了最后一个(这应该是总和)。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

字典不记得元素的顺序。我认为对于这种情况,使用orderDict会有点矫枉过正。尽量保持您的类型尽可能简单(除非您需要print语句的订单)。

我个人认为最好的方法是为玩家提供两个词典。一个用于前6种类型的卷(如果我记得正确地玩yahtzee)和一个用于特殊卷和奖励。

其次,因为卷的名称独立于玩家,我会将它们作为静态参数添加到类中。这样您就不必将它们作为构造函数的参数传递。它使制作新玩家更清晰(也更合乎逻辑)。我建议你阅读面向对象编程(OOP)。这将大大改善您的编码。

将得分的和函数添加到玩家类也是合乎逻辑的。每个玩家都有一个通过游戏更新的分数(或者在游戏结束时计算)。该课程将如下所示:

Class Player(Object):
    #static variables valid for all players:
    momentList1=() #add the names of the first 6 moments here
    momentList2=() #add the names of the other moments here

    def __init__(self, namn):
        self.namn = namn
        self.moment1 = {}
        self.moment2 = {}
        for ett_moment in Player.momentlist1:
            self.moment1[ett_moment]= 0
        for moment in Player.momentList2:
            self.moment2[moment]=0

    def gepoang(self, v_moment, v_poang):
       self.moment[v_moment]= v_poang

    def __str__(self):
       return self.namn + str(self.moment)

    def sumScore(self):
        # reset sum to 0, this allows multiple calls of sumScore without introducing errors
        sum1=0 
        sum2=0
        # loop over the first dict containing the rolls 1 -> 6
        for key in self.moment1: sum1+=self.moment1[key]
        # add the sum of the first 6 rolls to the second dict
        self.moment2[summa]=sum1
        # add the bonus to the second dict
        if (self.moment2[summa]>63): self.moment2[bonus]=50  
        for key in self.moment2: sum2+=self.moment2[key]
        return sum2

如果您只想使用一个字典(而不是更改您的对象)来保存所有项目,您可以使用要首先求和的元素迭代列表:

def sumFirstSix(self):
    """
    sums the first six moments and returns the sum of the values
    """
    l=('Ettor','Tvåor','Treor','Fyror','Femmor','Sexor')
    sum=0
    for item in l:
        sum+=self.moment[item]
    return sum

答案 1 :(得分:0)

首先我们要提一下,momentOrderedDict。因为没有订购术语前六个没有任何意义正常的dict。

有了这个,您可以简单地遍历kv中的键值对OrderedDict,并对值求和。因此,如果您想要对moment的前六项的值求和,它将看起来像

sum([kv[1] for i, kv in enumerate(moment.iteritems()) if i < 6])

这有帮助吗?