骰子滚动模拟器的Python数据结构

时间:2015-04-25 06:08:18

标签: python list

所以我在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)

2 个答案:

答案 0 :(得分:3)

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 roll == 6之前,您必须评估五种不同的if语句。相比之下,计数器使用hash table,因此c[roll]占用相同的时间,无论您制作多少卷。

这引出了一个问题:你怎么知道何时应该使用集合而不是一组变量?经验法则是,如果一组对象是同一事物的不同实例,并且我们打算以完全相同的方式使用每个对象,则它们可能属于集合。在这种情况下,就程序流程而言,1卷或4卷的卷基本相同。我们将始终以同样的方式对待他们。因此,应将它们保存在一个系列中。

答案 1 :(得分:0)

如果您希望答案更接近原始实施,但使用的是代码,则可以替换dieroll()

def dieroll(die_amount):
    rolls = [0] * 6
    for i in range(die_amount):
        roll = randint(1,6)
        print "\t You rolled: %s" % roll
        rolls[roll-1] += 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
        """ % tuple(rolls)
    return rolls