所以我用Python制作了一个骰子滚动模拟器,虽然它可以完成我想要的一切,但我被告知我可以实现列表或字典,这将是“更好”的代码。我尝试将两者添加到我的代码中,但完全迷失了。如果你们中的任何人能帮助/告诉我那就太棒了。这是我的代码,非常感谢。
from random import randint
print ""
die_amount = raw_input(">How many dice would you like to roll?: " )
die_amount = int(die_amount)
print ""
print "\t %s die are being rolled:" % die_amount
def dieroll(die_amount):
one = 0
two = 0
three = 0
four = 0
five = 0
six = 0
for i in range(1, die_amount+1):
roll = randint(1,6)
print "\t You rolled: %s" % roll
if roll == 1:
one +=1
elif roll == 2:
two +=1
elif roll ==3:
three +=1
elif roll == 4:
four +=1
elif roll == 5:
five+=1
elif roll == 6:
six +=1
print """
One's rolled: %s
Two's rolled: %s
Three's rolled: %s
Four's rolled: %s
Five's rolled: %s
Six's rolled: %s
""" % (one, two, three, four, five, six )
return [one, two, three, four, five, six]
dieroll(die_amount)
最佳答案
一个Counter
data structure正是您想要做的事情。
from collections import Counter
c = Counter()
for i in range(die_amount):
roll = randint(1,6)
c[roll] += 1
或者,更简单:
c = Counter(randint(1,6) for i in range(die_amount))
c[1]
然后包含 1
滚动的次数等。
要打印卷数,您可以使用
for number, count in c.iteritems():
print "{}'s rolled: {}".format(number, count)
<小时/>
Counter
基本上是一个默认值为零的 Python 字典。例如,这使得它特别适合计算列表中出现的对象数量。
这种方法比为每个计数保留一个单独的变量更有效的原因有很多。
如果您想要一百面骰子,则必须定义 100 个单独的变量。这更容易出错。
原则上,它要快得多。有六个不同的变量需要使用一系列 if 语句循环遍历它们。想象一下你掷出了六分。您必须评估五个不同的 if 语句,直到到达
if roll == 6
。相比之下,计数器使用 hash table ,因此无论您投了多少卷,c[roll]
都会花费相同的时间。
这就引出了一个问题:您如何知道何时应该使用集合而不是一组变量?经验法则是,如果一组对象是同一事物的不同实例,并且我们打算以完全相同的方式使用每个对象,那么它们可能属于一个集合。在这种情况下,就程序流程而言,掷 1 或掷 4 本质上是相同的。我们将始终一视同仁地对待他们。因此,它们应该被保存在一个集合中。
关于掷骰子模拟器的Python数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29861668/