возвращает разницу двух dicts и вычитает ее значения

#python #dictionary

#python #словарь

Вопрос:

Ниже приведен мой код. У меня есть список элементов, как указано в списке [4,5,11,5,6,11]. Результирующий результат, который я ожидаю, — это несбалансированные элементы в массиве.

 from collections import Counter

list_elem = [4,5,11,5,6,11]
dict_elem = dict(Counter(list_elem))
max_val = dict([max(dict_elem.items(), key=lambda x: x[1])])
o={k:v for k,v in dict_elem.items() if k not in max_val or v != max_val[k]}

Expecting o to be {4: 1, 6: 1} not {4: 1, 11: 2, 6: 1}

If the list_elem is [1,5,6,7,1,6,1] then I want the output to be  {5:2,7:2,6:1}
i.e. 3 being the value for the key- 1, and then we need the rest of the values of the keys to have value subtracted from the max, i.e -3
  

Комментарии:

1. значение «несбалансированных элементов в массиве»?

2. Пожалуйста, используйте лучшие имена для ваших значений, это поможет вам и другим прочитать ваш код. Также collections.Counter было бы лучше, чем вы понимаете, для d поскольку использование count в понимании не одобряется

3. Сбалансированный массив — это массив, содержащий все элементы, которые появляются равное количество раз

4. По этому определению не {4: 1, 6: 1} все еще сбалансировано? они оба отображаются один раз. Пожалуйста, объясните подробнее, что такое unbalanced.

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

Ответ №1:

Создаем счетчик и вычитаем его из того, что было бы сбалансировано:

 ctr = Counter(list_elem)
bal = Counter(dict.fromkeys(ctr, max(ctr.values())))
o = dict(bal - ctr)