Как найти, какой элемент чаще всего встречается в словаре Python

Если у вас есть словарь на питоне, как бы вы нашли, какой элемент встречается в нем наибольшее количество раз. Например, если у вас есть следующий словарь, имя Боб встречается больше всего (3 раза) (один раз как ключ и два раза как значение). Как бы вы нашли это имя, которое встречается чаще всего? Кроме того, я бы предпочел ничего не импортировать (так как я новичок)

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

Пожалуйста, вставьте код правильно, а также вашу попытку решить проблему

Aaj Kaal 11.12.2020 20:08

Вы пробовали что-нибудь и столкнулись с какой-то конкретной проблемой? В настоящее время это выглядит так, как будто вы хотите, чтобы мы написали код для вопроса, который выглядит как домашнее задание...

Thierry Lathuille 11.12.2020 20:09

См. эту статью, чтобы узнать, как создать минимальный воспроизводимый пример

G. Anderson 11.12.2020 20:12

Это не домашний вопрос, я просто придумал пример, чтобы вопрос был более понятным.

Rickyboyy 11.12.2020 20:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
459
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я предполагаю, что вы имеете в виду, как найти, какой элемент является наиболее распространенным среди всех списков, которые появляются в вашем словаре в качестве значений. Если это так, то следующее должно помочь:

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'

Он тоже хочет ключи

IoaTzimas 11.12.2020 20:15

Мне нужно то, что больше всего появляется во всем словаре (то есть как ключ, так и значение). Также есть ли способ сделать это без импорта чего-либо?

Rickyboyy 11.12.2020 20:17

@GiorgosMyrianthous, можно ли сделать что-то подобное без импорта?

Rickyboyy 11.12.2020 20:19

@Rickyboyy Быстрое объяснение того, что означает flatten: в основном он просто добавляет все ключи и все значения в список, например. {"a":["b","c"]} сплющенный ["a", "b", "c"].

M-Chen-3 11.12.2020 20:37

Вы можете создать список со всеми элементами (ключи + значения) dict и использовать collections.Counter. d — ваш словарь (дикт, который вы использовали, не является правильным именем для Python, поскольку он уже используется для встроенной структуры)

from collections import Counter
l=[i for i in d.keys()]+[i for k in d.values() for i in k]

res=Counter(l)

>>> print(res)

Counter({'Bob': 3, 'Paul': 2, 'Carol': 2, 'Will': 2, 'Mark': 1, 'Tim': 1, 'Leanne': 1, 'Zach': 1, 'Sarah': 1, 'Don': 1})

Возможно ли это без импорта?

Rickyboyy 11.12.2020 20:21

Вы можете подсчитать ключи, используя Counter, и обновить их количеством значений.

Затем вы можете использовать метод счетчика 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

Есть ли способ сделать это без импорта?

Rickyboyy 11.12.2020 20:18

Да, конечно, но это потребует от вас написания большего количества кода, чем если бы вы использовали существующие инструменты. Создайте словарь для хранения ваших подсчетов, повторите элементы словаря, подсчитайте ключ и подсчитайте каждое имя в значении. Затем вам нужно будет найти ключ с наибольшим значением среди ваших подсчетов.

Thierry Lathuille 11.12.2020 20:25

Хорошо, я посмотрю на это. Я пока не хочу использовать импорт

Rickyboyy 11.12.2020 20:28

Я все еще немного смущен этим. Можете ли вы привести пример того, как это сделать без импорта?

Rickyboyy 11.12.2020 22:40
Ответ принят как подходящий

Вот способ сделать это без импорта. Он определяет функцию check, выполняет итерацию dic один раз, чтобы сгенерировать dic_count, а затем использует другой цикл for для получения max_count и most_common_name.

Примечание: никогда не называйте переменные или функции после встроенных функций или объектов Python. Вот почему я переименовал dict в dic.

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

# Adds string to dic_count if it's not in,
# otherwise increments its count
def check(string):
    if string in dic_count:
        dic_count[string] += 1
    else:
        dic_count[string] = 1

for key, value in dic.items():
    # Calls the check function for both keys and values
    check(key)
    for name in value:
        check(name)


max_num = 0
most_common_name = ""
for key, value in dic_count.items():
    # If the count is greater than max_num,
    # updates both max_num and most_common_name
    if value > max_num:
        max_num = value
        most_common_name = key
        
print(most_common_name)
# Prints Bob

Если вы хотите получить несколько имен, измените последнюю часть на

max_num = 0
most_common_names = ""
for key, value in dic_count.items():
    # If the count is greater than max_num,
    # updates both max_num and most_common_name
    if value > max_num:
        max_num = value
        most_common_names = key
    elif value == max_num:
        most_common_names += " " + key
        
print(most_common_names)
# Prints Bob Will after adding an extra
# 'Will' to the dictionary

В качестве альтернативы, если вы хотите избежать определения функции, просто замените верхнюю часть на:

for key, value in dic.items():
    # Adds string to dic_count if it's not in,
    # otherwise increments its count
    if key in dic_count:
        dic_count[key] += 1
    else:
        dic_count[key] = 1
    for name in value:
        if name in dic_count:
            dic_count[name] += 1
        else:
            dic_count[name] = 1

Потрясающе спасибо. Можно ли сделать это без определения функции и вместо этого, возможно, создать пустой список и добавить имена по мере подсчета?

Rickyboyy 12.12.2020 02:42

@Rickyboyy Конечно, везде, где вы видите, как я использую функцию, просто замените ее ее кодом, соответствующим образом вставив строки. Это сделает ваш код намного длиннее, поэтому вместо этого я решил определить функцию. Я отредактирую свой ответ.

M-Chen-3 12.12.2020 05:07

Вы случайно не ищете что-то подобное

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

Я знаю, что это не лучший способ ... если у кого-то есть какие-либо предложения, пожалуйста, оставьте их в комментарии, я отредактирую свой ответ с этими

Это хорошо. Однако, когда я попытался применить это в ситуации, когда есть 2 элемента с одинаковым значением, которые являются наиболее распространенными, он отображает только один из них.

Rickyboyy 11.12.2020 22:10

@Rickyboyy В моем ответе есть способ отобразить несколько элементов.

M-Chen-3 12.12.2020 01:37

Пожалуйста, проверьте комментарии в коде Используйте цепочку для объединения ключей и значений Используйте defaultdict, который является частным случаем dict куда добавляется ключ, если он отсутствует

Код:

from itertools import chain
from collections import defaultdict

# do not use dict - no shadowing built-in dict
my_dict = {'Mark': ['Paul', 'Bob', 'Carol', 'Leanne', 'Will'], 'Paul': ['Will', 'Zach'], 'Bob': ['Sarah', 'Don'], 'Tim': ['Bob', 'Carol']}

#searching for one specific name occurence
name_to_search = 'Bob'
name_ctr = sum([1 for ele in chain(my_dict.keys(), *(my_dict.values())) if ele == name_to_search])
print(f'{name_to_search} occurs {name_ctr} times')

#searching for max occuring name in a dictionary
my_dict_name_ctr = defaultdict(int)
for name in chain(my_dict.keys(), *(my_dict.values())):
    my_dict_name_ctr[name] += 1
max_occuring_val = max(my_dict_name_ctr.values())    
most_occuring_names = [name for name,val in my_dict_name_ctr.items() if val == max_occuring_val]
print(most_occuring_names, 'occurs', max_occuring_val, 'times')

Выход:

Bob occurs 3 times
['Bob'] occurs 3 times

Другие вопросы по теме