Python 如何对列表中DICT的某些值求和?

Python 如何对列表中DICT的某些值求和?,python,list,dictionary,sum,Python,List,Dictionary,Sum,我在Yatzee中有一个协议,包含一个列表中每个玩家的e 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个加起来,然后再把所有的加起来,最后一个除外(应该是加起来的) 感谢您的帮助字典不

我在Yatzee中有一个协议,包含一个列表中每个玩家的e 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个加起来,然后再把所有的加起来,最后一个除外(应该是加起来的)


感谢您的帮助

字典不记得元素的顺序。我认为在这种情况下,使用orderDict会有点过分。尽量使您的类型尽可能简单(除非您需要打印语句的顺序)

我个人认为最好的方法是为一个玩家准备两个字典。一个用于前6种类型的掷骰(如果我记得正确地玩了yahtzee),一个用于特殊掷骰和Bonusse

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

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

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

所以首先我们必须提到,
时刻
是一个
有序的信息传递
。因为如果没有对前六个词进行排序,那么这六个词就没有意义了

这样,您就可以简单地迭代
OrderedDict
中的键值对
kv
,并对值求和。因此,如果你想对
矩的前六项的值求和,它会如下所示

sum([kv[1] for i, kv in enumerate(moment.iteritems()) if i < 6])
sum([kv[1]表示i,枚举中的kv(矩.iteritems()),如果i<6])

这有帮助吗?

为什么要在玩家类之外计算分数的总和?为什么不使用英语作为变量和函数?我不确定,我的所有其他函数,如def GivePoints和def PrintProtocol都在类之外。在下面的答案中添加了实现。我还建议您对代码多加注释,并将参数更改为septi建议的英语参数。这使代码的重用更加容易。这不是代码编写或教程服务。在编码之前花些时间思考;哪些操作对哪些对象有意义?如果您遇到问题,也许
OrderedDict
不是最好的数据结构?如果你想继续在这里提问,用英语编写代码可能是明智的(正如《风格指南》所建议的,“除非你有120%的把握认为这些代码永远不会被不懂你的语言的人阅读”)。我收到了以下错误消息:Traceback(最近的一次呼叫):File“/Users/Mans/Desktop/P-uppgit/Yatzy_huvudprogram2.py”,第211行,在meny()文件“/Users/Mans/Desktop/P-Uppgift/Yatzy_huvudprogram2.py”中,第203行,在meny summing(protokoll)文件“/Users/Mans/Desktop/P-Uppgift/Yatzy_huvudprogram2.py”中,第29行,在summing oversumma=summa([kv[1]表示i,如果i<6]则在枚举(矩.iteritems())中)NameError:name'moment'未定义>>>当然,您必须稍微调整代码。例如,如果你将其粘贴到你的方法
汇总中
,你必须写
自我。片刻
请同时投票选出答案,以区分提议的答案。