Я просто быстро бросил это вместе.
bought = {
"January": ['Apple', 'Banana', 'Orange', 'Kiwi', 'Raspberry'],
"February": ['Orange', 'Mango', 'Banana'],
"March": ['Apple', 'Starfruit', 'Apricot']
}
numbers = {}
allb = []
for month in bought:
allb += bought[month]
for item in allb:
if item in numbers:
numbers[item] += 1
else:
numbers[item] = 1
print(numbers) # Note you can format this however you want: just iterate through the dictionary again
Apple: 2, Banana: 2, Orange: 2, Kiwi: 1, Raspberry: 1, Mango: 1, Starfruit: 1, Apricot: 1
{'Apple': 2, 'Banana': 2, 'Orange': 2, 'Kiwi': 1, 'Raspberry': 1, 'Mango': 1, 'Starfruit': 1, 'Apricot': 1}
(Поскольку numbers
является словарем, вы можете сделать очень мощные вещи для поиска чисел. В этом случае он действует как таблица.)
Первый for
цикл проходит через все купленные ключи (как отформатировано, все месяцы) и ищет их значение. Затем эти значения добавляются в мой список allb
(все куплено). Далее я перебираю allb
и if
, что элемент уже в числах: я добавляю 1 к счету, в противном случае я устанавливаю счет в 1. [ 1113]
Хорошо, я нашел другой алгоритм: метод псевдонима (также упоминается в этом ответе ). По сути, он создает такое разделение вероятностного пространства:
n
разделов, все одинаковой ширины r
st nr = m
. . 12100] каждый раздел содержит два слова в некотором соотношении (которое сохраняется вместе с разделом). w i
, f i = ∑ разделы t st w i ∈ t r × ratio (t, w i )
Поскольку все разделы имеют одинаковый размер, выбор раздела может выполняться в постоянной работе (выберите случайным образом индекс из 0 ... n-1
), а раздел Затем можно использовать коэффициент s, чтобы выбрать, какое слово будет использоваться в постоянной работе (сравните число в формате pRNG с соотношением между двумя словами). Таким образом, это означает, что выбор p
может быть выполнен в O (p)
работе с таким разделом.
Причина, по которой такое разделение существует, заключается в том, что существует слово w i
st f i
w i '
st f i '> r
, поскольку r - это среднее значение частот.
Учитывая такую пару w i
и w i '
, мы можем заменить их псевдословом w' i
частоты f ' i = r
(что представляет w i
с вероятностью f i / r
и w i '
с вероятностью 1 - f i / r
) и новым словом w' i '
настроенной частоты ] f ' i' = f i ' - (r - f i )
соответственно. Средняя частота всех слов по-прежнему будет r, и по-прежнему действует правило из предыдущего абзаца. Поскольку псевдослово имеет частоту r и состоит из двух слов с частотой r, мы знаем, что если мы будем повторять этот процесс, мы никогда не получим псевдослово из псевдослова, и такая итерация должна заканчиваться последовательность из n псевдословов, которые являются искомым разделом.
Это действительно работает, если количество разделов q> n
(вам просто нужно доказать это по-другому). Если вы хотите убедиться, что r является целым, и вы не можете легко найти множитель q
из m
st q> n
, вы можете заполнить все частоты в n
, поэтому f ' i = nf i
, что обновляет m' = mn
и устанавливает r '= m
, когда q = n
.
В любом случае,