Создать матрицу совместного использования из словарного ключа, значения в Python - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать матрицу совместного использования из словаря уникальных ключей с перекрывающимися значениями (в Python 3). Вот моя структура данных:

keys = ['A','B','C','D']
vals = [[1,2],1,[1,3],2]

dict = {'A':[1,2], 'B':1, 'C':[1,3], 'D':2]}

Как мне создать матрицу, которая подсчитывает вхождения значений для каждого ключа в форме:?

   1.  2.  3. 
A. 1   1   0 
B. 1   0   0 
C. 1   0   1 
D. 0   1   0 

Меня рекомендовали используйте defaultdict, но я не уверен, как это реализовать. Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Предполагая, что:

  • могут быть пропуски в значениях исходного дикта, которые не должны быть пропущены, и
  • вас интересует только диапазон, определенный min и max значение

вы можете сделать:

d = {'A':[1,2], 'B':[1], 'C':[1,3], 'D':[2]}

values_flat = {v for sub in d.values() for v in sub}
max_value = max(values_flat)
min_value = min(values_flat)

result = {k : [int(i in v) for i in range(min_value , max_value +1)] for k, v in d.items()}

print(result)  # {'A': [1, 1, 0], 'B': [1, 0, 0], 'C': [1, 0, 1], 'D': [0, 1, 0]}

Обратите внимание, что я позволил себе переопределить и переименовать ваш оригинал dict. Теперь все значения являются списками. Согласованные данные очень важны, поэтому, если у вас есть какой-либо контроль над входными данными, убедитесь, что вы сначала очистите их. Также обратите внимание, что dict является неверным именем переменной, поскольку оно скрывает встроенную Python.

0 голосов
/ 25 марта 2020

Вы можете сделать:

d = {'A': [1, 2], 'B': [1], 'C': [1, 3], 'D': [2]}

values = sorted(set(e for v in d.values() for e in v))

result = {k : [1 if value in v else 0 for value in values] for k, v in d.items()}

print(result)

Вывод

{'A': [1, 1, 0], 'B': [1, 0, 0], 'C': [1, 0, 1], 'D': [0, 1, 0]}

Если существует множество значений, которые вы можете использовать наборы для проверки содержания, что-то вроде этого:

d = {'A': [1, 2], 'B': [1], 'C': [1, 3], 'D': [2]}
d = { k : set(v) for k, v in d.items() }

Более сжатый способ, предложенный @Ev. Kounis должен сделать:

result = {k : [int(value in v) for value in values] for k, v in d.items()}

Наконец, если вас интересует список структуры данных списка (то есть матрицы), вы можете поместить значения результата в список:

print(list(result.values()))

Выход

[[1, 1, 0], [1, 0, 0], [1, 0, 1], [0, 1, 0]]
...