掷骰子模拟器的Python数据结构

标签 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)

最佳答案

一个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/

相关文章:

python - 'utf- 8' codec can' t 解码字节 - Python

python - 在 Python 中装饰生成器 : call some method in between yields

python - 有没有人设法在 Mac OS X Leopard 上为 apache 编译 mod_wsgi?

javascript - 创建列表时像在 Ranker.com 上一样创建多个项目

c - 如何将元素添加到仅给定 head 的指针列表的末尾?

c++ - 清除 std::list 动态对象的最快方法是什么?

flutter - 如何在不识别键的情况下获取列表<map<string,dynamic>数据每个映射键和值

python - 使用 twisted.trial.unittest 时 react 堆在测试之间停止

python - 作为键的单词词典和作为值出现的句子

python - 如何修复这个奇怪的错误 : "RuntimeError: CUDA error: out of memory"