掷骰子的频率,然后获得最多的掷骰子

时间:2019-12-02 22:51:32

标签: python

因此,我编写了此代码,该代码首先列出了1000卷。然后我编写了一个函数,该函数使用字典来确定每个骰子滚动的频率。那么我想打印发生最多的纸卷及其频率。

import random
L = []
for i in range(1000):
    currentRoll = random.randint(1, 6)
    L.append(currentRoll)


def diceFreq(L):
    rollCount = {}
    for roll in L:
        if roll not in rollCount:
            rollCount[roll] = 1
        else:
            rollCount[roll] += 1
    print(rollCount)
    print(max(rollCount, key=rollCount.get))
    print(max(rollCount.values()))

diceFreq(L)

我不明白print(max(rollCount, key=rollCount.get))的字眼到底在做什么?

2 个答案:

答案 0 :(得分:2)

Max将收到一个可迭代的值并评估最大值。 即:

max([1,2,3]) # >> returns 3
max("abc") # >> returns 'c'
max({"a": 10, "b": 5}) # >> returns 'b'

您的rollCount是一个默认情况下将迭代键的字典。

但是,当您向max函数添加key时,它将根据您设置的可调用对象评估要考虑的max值。

即:

max([1,2,3], key=lambda x: -x) # >> returns 1

在这种情况下,它将最大值发送给可调用对象后进行比较。 (1,2,3在比较时变为-1,-2,-3,但将返回原始值。)

当您从词典中调用.get时,将期望传递key。当您这样做时:

d = {"a": 10, "b": 5}
max(d, key=d.get)  # returns 'a'

它将进行'a' >= 'b',而不是比较d.get('a') >= d.get('b')

d.get('a') # >> 10
d.get('b') # >> 5

在这种情况下返回'a'

答案 1 :(得分:0)

我建议您利用collections.Counter类,该类以更Python化的方式完成diceFreq函数的所有工作。会

  • 计算每次掷骰的次数
  • 将卷从发生最多的位置排序到发生最少的
  • 返回roll:count键值对字典。

因此,您可以用以下内容替换整个diceFreq()定义:

import collections
import operator
print(collections.Counter(L).most_common(1)[0])

第3行从L创建这样的计数器。您可以打印出该计数器以确认它有6个项目,每卷一个。字典中的每个项目都有一个关联的计数,所有计数之和总计为1000。然后,它使用most_common(1)方法仅返回最常滚动的值及其计数。最后,我们使用切片[0]将元组从most_common()返回的列表中删除。