Это очень простое решение, возможно, не самое эффективное (?), но простое.
data = get_data()
freqs, numbers = {}, {}
for i in data:
freqs[i] = freqs.get(i, 0) + 1
for n, c in freqs.items():
numbers[c] = numbers.get(c, []) + [n]
counts = list(numbers.keys())
res = (numbers[min(counts)], numbers[max(counts)])
Давайте подробно посмотрим, что у нас есть в скрипте выше, начнем с данных примера, которые вы дали,
In [1]: data = [13,12,11,13,14,13,7,11,13,14,12,14,14]
Мы будем использовать два словаря,
In [2]: freqs, numbers = {}, {}
первый заполняется, повторяя data
, его ключи - это отдельные числа в data
, а его значения - частота каждого числа в данных (см. примечание для freqs.get(…)
)
In [3]: for i in data: freqs[i] = freqs.get(i, 0) + 1
второй - это просто обращение первого, ключи - это частоты, а значения - списки чисел с заданной частотой.
In [4]: for n, c in freqs.items(): numbers[c] = numbers.get(c, []) + [n]
In [5]: numbers
Out[5]: {1: [7], 2: [12, 11], 4: [13, 14]}
На данный момент нам нужен список с ключами numbers
, т.е.
In [6]: counts = list(numbers.keys())
потому что нас интересуют минимальные и максимальные значения вхождений
In [7]: [numbers[min(counts)], numbers[max(counts)]]
Out[7]: [[7], [13, 14]]
Сноска: метод .get(key, default_value)
словаря возвращает значение по умолчанию, если ключ отсутствует в словаре. Мы использовали эту функцию со значением по умолчанию 0
для суммирования вхождений отдельных чисел и с []
, пустым списком, для построения список всех номеров с заданной частотой.
person
gboffi
schedule
30.08.2017