Словарь Python — Как найти все ключи с наименьшим количеством уникальных значений?

#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']