#python #dictionary
#python #словарь
Вопрос:
Допустим, у меня есть словарь:
dict = {'a' : [1, 2], 'b' : [1], 'c' : [3, 3, 3]}
Как мне найти, какие ключи имеют наименьшее количество уникальных значений? В этом случае это будет словарь с ключами ‘b’ и ‘c’, поскольку каждый из них имеет только 1 уникальное значение.
Ответ №1:
Вы можете создать инвертированное отображение, используя collections.defaultdict
ключи, соответствующие наименьшему количеству уникальных значений, и получить к ним доступ:
from collections import defaultdict
d = {'a' : [1, 2], 'b' : [1], 'c' : [3, 3, 3]}
# dictionary mapping len of unique values to corresponding key
d2 = defaultdict(list)
for k in d:
d2[len(set(d[k]))].append(k)
print (d2)
# defaultdict(list, {2: ['a'], 1: ['b', 'c']})
print (d2[min(d2)])
# ['b', 'c']
Ответ №2:
Вы можете сделать следующее:
d = {'a' : [1, 2], 'b' : [1], 'c' : [3, 3, 3]} #avoid using 'dict' as name of dictionary
temp={k:len(set(v)) for k, v in d.items()} #get the count of unique values for each key
res=[i for i in temp if temp[i]==min(temp.values())] #get the keys with min value
>>> print(res)
['b', 'c']
Комментарии:
1. Спасибо за быстрый ответ! Это очень помогло мне в моем проекте!
2. Рад помочь 🙂 Не забудьте проголосовать за правильные ответы, теперь, когда вы прошли 15 повторений. Приветствия!
Ответ №3:
Попробуйте так:
d = {'a' : [1, 2], 'b' : [1], 'c' : [3, 3, 3]}
ml={i:len(set(m)) for i,m in d.items()}
res={i:d[i] for i,z in ml.items() if z==min(ml.values())}
print(res)
Ответ №4:
Вы можете выполнить следующие три шага
# Create a dictionary d with format {key: number of unique values}
d = {key: len(set(value)) for key, value in dict.items()}
# Find the minimum value in this dictionary
min_value = min(d.values())
# Find all the keys with value equal to the minimum
min_list = [key for key, value in d.items() if value == min_value]
Результатом будет список, содержащий b и c в вашем примере
Ответ №5:
Вы могли бы использовать вспомогательный dict или понимание, как в других ответах, если вам нужно выполнить дальнейшую обработку, в противном случае ИМО не нужно ничего особенного, простой цикл for должен сделать свое дело, используя set()
преобразование как быстрый способ подсчета уникальных значений
Кроме того, рекомендуется не использовать dict
в качестве имени переменной dict, поскольку это зарезервированное ключевое слово в python, и оно будет скрывать использование этого ключевого слова
def keys_with_fewest_uniq_values(d):
min_num_uniq, min_keys = None, []
for key, val in dict.items():
num_uniq = len(set(val))
if min_num_uniq is None or num_uniq < min_num_uniq:
min_num_uniq = num_uniq
min_keys = [key]
elif num_uniq == min_num_uniq:
min_keys.append(key)
return min_keys
>> my_dict = {'a' : [1, 2], 'b' : [1], 'c' : [3, 3, 3]}
>> print(keys_with_fewest_uniq_values(my_dict))
['b','c']