У меня есть словарь dict в Python. Представьте себе этот простой пример. Dict:
bin1:{apple,apple,cherry,cherry,cherry,banana,banana,avocado}
bin2:{cucumber,cucumber,cucumber,cucumber,apple}
bin3:{cherry,cherry,banana,banana}
Я хочу рассчитать и сохранить это (в любом представлении я просто не могу придумать структуру данных):
Строки представляют все ключи, столбцы представляют все доступные различные фрукты во всех словарных значениях
Числа означают это: для каждого ключа мы вычисляем количество раз, когда появляется плод для этого ключа, деленный на количество раз больше других конкретных фруктов, больше всего для этого ключа.
Пример: для bin1: вишня выглядит наиболее (3), поэтому яблоки будут 2/3 (яблоки появляются 2 раза, разделенные вишней, появляются 3 раза) и так далее.
Возможно, мы можем создать нечто вроде словаря внутри словаря:
bin1:{apple:2/3,banana:2/3,cherry:1,cucumber:0,avocado:1/3}
bin2:{apple:1/4,banana:0,cherry:0,cucumber:1,avocado:0}
bin3:{apple:0,banana:1,cherry:1,cucumber:0,avocado:0}
Это всего лишь операция в списке, поскольку вы просто работаете над каждой строкой самостоятельно. Так
row1 = ["apple", "apple", "cherry", "cherry", "cherry", "banana", "banana", "avocado"]
import collections
row1count = collections.Counter(row1)
max_per_row = max(row1count.values()) # for python2: wrap with float()
{x: y/max_per_row for (x, y) in row1count.items()}
Результат:
{'apple': 0.6666666666666666, 'cherry': 1.0, 'banana': 0.6666666666666666, 'avocado': 0.3333333333333333}
Это использует collections.Counter
чтобы вычислить количество вхождений каждого элемента. Затем он определяет максимальное значение и делит на него в понимании dict.