繁体   English   中英

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

[英]Python data structure for dice roll emulator

所以我在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数据结构完全符合您的要求。

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语句。 相比之下,计数器使用哈希表 ,因此无论您使用多少卷, c[roll]需要相同的时间。

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

如果您希望答案更接近原始实现,但使用列表,则可以替换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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM