Если у вас есть словарь на питоне, как бы вы нашли, какой элемент встречается в нем наибольшее количество раз. Например, если у вас есть следующий словарь, имя Боб встречается больше всего (3 раза) (один раз как ключ и два раза как значение). Как бы вы нашли это имя, которое встречается чаще всего? Кроме того, я бы предпочел ничего не импортировать (так как я новичок)
dict = {'Mark': ['Paul', 'Bob', 'Carol', 'Leanne', 'Will'], 'Paul': ['Will', 'Zach'], 'Bob': ['Sarah', 'Don'], 'Tim': ['Bob', 'Carol']}
Вы пробовали что-нибудь и столкнулись с какой-то конкретной проблемой? В настоящее время это выглядит так, как будто вы хотите, чтобы мы написали код для вопроса, который выглядит как домашнее задание...
См. эту статью, чтобы узнать, как создать минимальный воспроизводимый пример
Это не домашний вопрос, я просто придумал пример, чтобы вопрос был более понятным.
Я предполагаю, что вы имеете в виду, как найти, какой элемент является наиболее распространенным среди всех списков, которые появляются в вашем словаре в качестве значений. Если это так, то следующее должно помочь:
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'
Он тоже хочет ключи
Мне нужно то, что больше всего появляется во всем словаре (то есть как ключ, так и значение). Также есть ли способ сделать это без импорта чего-либо?
@GiorgosMyrianthous, можно ли сделать что-то подобное без импорта?
@Rickyboyy Быстрое объяснение того, что означает flatten
: в основном он просто добавляет все ключи и все значения в список, например. {"a":["b","c"]}
сплющенный ["a", "b", "c"]
.
Вы можете создать список со всеми элементами (ключи + значения) 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})
Возможно ли это без импорта?
Вы можете подсчитать ключи, используя 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
Есть ли способ сделать это без импорта?
Да, конечно, но это потребует от вас написания большего количества кода, чем если бы вы использовали существующие инструменты. Создайте словарь для хранения ваших подсчетов, повторите элементы словаря, подсчитайте ключ и подсчитайте каждое имя в значении. Затем вам нужно будет найти ключ с наибольшим значением среди ваших подсчетов.
Хорошо, я посмотрю на это. Я пока не хочу использовать импорт
Я все еще немного смущен этим. Можете ли вы привести пример того, как это сделать без импорта?
Вот способ сделать это без импорта. Он определяет функцию 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 Конечно, везде, где вы видите, как я использую функцию, просто замените ее ее кодом, соответствующим образом вставив строки. Это сделает ваш код намного длиннее, поэтому вместо этого я решил определить функцию. Я отредактирую свой ответ.
Вы случайно не ищете что-то подобное
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 В моем ответе есть способ отобразить несколько элементов.
Пожалуйста, проверьте комментарии в коде Используйте цепочку для объединения ключей и значений Используйте 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
Пожалуйста, вставьте код правильно, а также вашу попытку решить проблему