因此,我编写了此代码,该代码首先列出了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))
的字眼到底在做什么?
答案 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
函数的所有工作。会
因此,您可以用以下内容替换整个diceFreq()
定义:
import collections
import operator
print(collections.Counter(L).most_common(1)[0])
第3行从L创建这样的计数器。您可以打印出该计数器以确认它有6个项目,每卷一个。字典中的每个项目都有一个关联的计数,所有计数之和总计为1000。然后,它使用most_common(1)
方法仅返回最常滚动的值及其计数。最后,我们使用切片[0]
将元组从most_common()
返回的列表中删除。