如何查找python字典中出现最多的元素

如何查找python字典中出现最多的元素,python,python-3.x,Python,Python 3.x,如果你有一本python字典,你会如何找到其中出现次数最多的元素。例如,如果您有以下字典,则Bob这个名字出现的次数最多(3次)(一次作为键,两次作为值)。您如何找到出现次数最多的名称? 另外,我不想进口任何东西(因为我是初学者) 我想你的意思是,如何在字典中以值形式出现的所有列表中找到最常见的元素。如果是这样的话,下面应该可以做到: from collections import Counter from itertools import chain dict = { 'Mark':

如果你有一本python字典,你会如何找到其中出现次数最多的元素。例如,如果您有以下字典,则Bob这个名字出现的次数最多(3次)(一次作为键,两次作为值)。您如何找到出现次数最多的名称? 另外,我不想进口任何东西(因为我是初学者)


我想你的意思是,如何在字典中以值形式出现的所有列表中找到最常见的元素。如果是这样的话,下面应该可以做到:

from collections import Counter
from itertools import chain

dict = {
    'Mark': ['Paul', 'Bob', 'Carol', 'Leanne', 'Will'], 
    'Paul': ['Will', 'Zach'], 
    'Bob': ['Sarah', 'Don'], 
    'Tim': ['Bob', 'Carol']
}

counter = Counter(chain.from_iterable(list(dict.values())))
counter.most_common()
[('Bob', 2), ('Carol', 2), ('Will', 2), ('Paul', 1), ('Leanne', 1), ('Zach', 1), ('Sarah', 1), ('Don', 1)]

如果您还需要考虑钥匙,则:

counter = Counter(chain.from_iterable(list(dict.values()) + [dict.keys()]))
counter.most_common()
[('Bob', 3), ('Paul', 2), ('Carol', 2), ('Will', 2), ('Leanne', 1), ('Zach', 1), ('Sarah', 1), ('Don', 1), ('Mark', 1), ('Tim', 1)]

如果不想使用外部库,请执行以下操作:

l = list(dict.keys()) + sum(list(dict.values()), []) # flatten list of lists
max(l, key=l.count)
>>> 'Bob'

您可以创建包含dict的所有项(键+值)的列表,并使用collections.Counter。d是您的字典(您使用的dict不是Python的专有名称,因为它已经用于内置结构)


您可以使用
计数器对键进行计数
,并使用值的计数对其进行更新

然后,您可以使用计数器的
most_common
方法获取最常用的名称:

from collections import Counter
from itertools import chain

d = {'Mark': ['Paul', 'Bob', 'Carol', 'Leanne', 'Will'], 'Paul': ['Will', 'Zach'], 'Bob': ['Sarah', 'Don'], 'Tim': ['Bob', 'Carol']}

count = Counter(d.keys())
count.update(chain.from_iterable(d.values()))
print(count.most_common(1))
# [('Bob', 3)]
print(count.most_common(1)[0][0])
# Bob

这里有一种不用进口就能做到这一点的方法。它定义了一个
check
函数,在
dic
中迭代一次以生成
dic\u计数
,然后使用另一个for循环来获得
max\u计数
最常见的\u名称

旁注:不要在内置Python函数或对象之后命名变量或函数。这就是我将
dict
重命名为
dic
的原因

dic={'Mark':['Paul','Bob','Carol','Leanne','Will'],'Paul':['Will','Zach'],'Bob':['Sarah','Don'],'Tim':['Bob','Carol']}
dic_计数={}
#如果不在dic_计数中,则将字符串添加到dic_计数中,
#否则将增加其计数
def检查(字符串):
如果dic_计数中的字符串:
dic_计数[字符串]+=1
其他:
dic_计数[字符串]=1
对于键,dic.items()中的值:
#调用键和值的检查函数
支票(钥匙)
对于值中的名称:
支票(姓名)
最大数量=0
most_common_name=“”
对于键,dic_count.items()中的值:
#如果计数大于max_num,
#更新max_num和most_common_名称
如果值>最大值:
max_num=值
最常见的名称=键
打印(最常用的名称)
#打印鲍勃
如果要获取多个名称,请将最后一部分更改为

max\u num=0
最常见的名称=“”
对于键,dic_count.items()中的值:
#如果计数大于max_num,
#更新max_num和most_common_名称
如果值>最大值:
max_num=值
大多数常用名称=密钥
elif值==最大值:
大多数常用名称+=“”+键
打印(大多数常用名称)
#在添加一个额外的
#“威尔”去查字典
或者,如果希望避免定义函数,只需将顶部替换为:

对于键,dic.items()中的值:
#如果不在dic_计数中,则将字符串添加到dic_计数中,
#否则将增加其计数
如果输入dic_计数:
dic_计数[键]+=1
其他:
dic_计数[键]=1
对于值中的名称:
如果dic_计数中的名称:
dic_计数[名称]+=1
其他:
dic_计数[名称]=1

你是在找这样的东西吗

dic = {'Mark': ['Paul', 'Bob', 'Carol', 'Leanne', 'Will'], 'Paul': ['Will', 'Zach'], 'Bob': ['Sarah', 'Don'], 'Tim': ['Bob', 'Carol']}

#getting all the keys
keyslist=dic.keys()

#fetting all the values of dic as list
valuelist=list(dic.values())
#valuelist.append(keyslist)
test_list=[]
test_list.extend(list(keyslist))
for x in valuelist:
    test_list.extend(x)
    
#list with all elements from dict
print(test_list)
 

# get most frequent element 
max = 0
res = test_list[0] 
for i in test_list: 
    freq = test_list.count(i) 
    if freq > max: 
        max = freq 
        res = i 

# printing result 
print ("Most frequent element is : " + str(res)+ " Frequency :" +str(max)) 
输出:

Most frequent element is : Bob Frequency :3
Bob occurs 3 times
['Bob'] occurs 3 times

我知道这不是最好的方法。如果有人有任何建议,请将其留在评论中,我将用这些建议编辑我的答案。请检查代码中的评论 使用“链”组合键和值 使用defaultdict,这是dict的一个特例 其中,如果不存在,则追加键

代码:

输出:

Most frequent element is : Bob Frequency :3
Bob occurs 3 times
['Bob'] occurs 3 times


请正确粘贴代码,并尝试soln。您是否尝试过任何操作,是否遇到了某些特定问题?这看起来像是你想让我们为一个家庭作业问题编写代码…如何创建一个非家庭作业问题,请参阅本文,我刚刚制作了一个示例,使问题变得更有意义。他想要这些键。我想要在整个字典中出现得最多的键(因此同时作为键和值)。还有一种不导入任何内容的方法吗?@Rickyboy更新了我的答案。@Giorgosmyriantous不导入也可以做类似的事情吗?@Rickyboy快速解释了什么是
flatten
的意思:基本上它只是将所有键和所有值添加到一个列表中,例如
{“a”:[“b”,“c”}
flatten是
[“a”,“b”,“c”]
。有没有办法不用导入就可以做到这一点?当然可以,但这需要编写比使用现有工具更多的代码。创建一个dict来存储您的计数,迭代dict的项,计数键,并计算值中的每个名称。然后你必须找到在你的计数中具有最高值的键。好的,我会研究一下。我不想用进口雪人,我还是有点困惑。你能给我举一个没有进口的例子吗?在没有进口的情况下这是可能的吗?这很好。然而,当我尝试在有两个相同值的元素最常见的情况下应用它时,它只显示其中一个them@Rickyboyy我的答案可以显示多个元素。非常感谢。是否可以在不定义函数的情况下执行此操作,而创建一个空列表并在计算时追加名称?@Rickyboy当然,无论您看到我在哪里使用函数,都可以用它的代码替换它,并相应地插入字符串。这将使您的代码更长,这就是为什么我选择定义一个函数。我将编辑我的答案。
Bob occurs 3 times
['Bob'] occurs 3 times