Python 如何对列表中DICT的某些值求和?
我在Yatzee中有一个协议,包含一个列表中每个玩家的e 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个加起来,然后再把所有的加起来,最后一个除外(应该是加起来的) 感谢您的帮助字典不
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'未定义>>>当然,您必须稍微调整代码。例如,如果你将其粘贴到你的方法汇总中
,你必须写自我。片刻
请同时投票选出答案,以区分提议的答案。