我有一个问题要在.txt文件中打印出频率最高的单词,并使用max函数来获得具有最大值的键,如下所示:
freq=dict()
f=open('words.txt','r')
for line in f:
words=line.split()
for word in words:
word=word.lower()
freq[word]=freq.get(word,0)+1
maximum=max(freq)
print(maximum)
但是在进行交叉检查后,我发现提供了错误的密钥作为输出。代码的第二部分更改如下:
maximum = max(freq, key=freq.get)
print(maximum)
在这里,获得的输出与出现最大次数的单词匹配。
我想知道两种情况下获得不同结果的原因,以及将来处理相似情况/问题时哪种方法更好。谢谢。
答案 0 :(得分:1)
max(freq)
返回字典中的最大键,如果键是字符串,则返回字母的最后一个键
添加key=freq.get
关键字参数时,将获得最大值为x
的元素freq.get(x)
答案 1 :(得分:0)
这是因为max(freq)
正在比较所有单词和彼此。
使用key=freq.get
来比较字典中的值并返回具有最高值的键。
答案 2 :(得分:0)
发生这种情况是因为max
不知道如何比较dict
的元素。因此,如果您不提供key
,则默认情况下会按字母顺序对它们进行比较。但是,当您给它一个函数时,它将使用该函数并根据该函数找到max:
>>> counts = {"a": 10, "b": 5, "c": 20, "d": 15}
>>> max(counts)
'd'
>>> max(counts, key=counts.get)
'c'
答案 3 :(得分:0)
您可能有多个具有最大值的键。 选项
maximum = max(freq, key=freq.get)
将返回与第一个值关联的键。 如果您想拥有另一个,您可以使用以下代码:
def select_key_with_max_value(my_dict):
my_lst=[(a,b) for (a,b)in my_dict.items()]
max_value = max(my_lst)[1]
lst_max_values = [(key,values) for (key,values) in my_dict.items()\
if values ==max(my_lst)[1] ]
lst_max_values =sorted(lst_max_values)
num = len(lst_max_values)
print ("There are {} items with a maximum value.".format(num))
order = int(input("Which of the key(s) do you want by the keys' alphabetic
order?"))-1
return lst_max_values[order][0]
举个例子:
Tv = { 'GameOfThrones':100, 'BreakingBad':100,'TMKUC' : 100}
select_key_with_max_value(Tv)
结果:
There are 3 items with a maximum value.
Which of the key(s) do you want by the keys' alphabetic order?3
'TMKUC'