Задача может быть выполнена следующим образом:
- Создать промежуточный словарь, ключами которого являются категории:
categoryX
, а значения - это список ребер, попадающих под categoryX
- Создайте окончательный словарь, ключами которого являются категории:
categoryX
и соответствующие значения - это словарь ребер, попадающих под categoryX
Мы используем встроенный defaultdict, чтобы упростить созданиепромежуточный словарь
from collections import defaultdict
edges = {1 : [987, 682, 465],
2 : [45, 67, 85, 907],
3 : [32, 563, 659, 902]}
categories = {1 : ['category1', 'category37'],
2 : ['category45', 'category86'],
3 : ['category1', 'category2']}
intermediate = defaultdict(list)
for k, v in categories.items():
for c in v:
intermediate[c].append(k)
final = defaultdict(dict)
for k, v in intermediate.items():
final[k] = {i:edges[i] for i in v}
Мы также можем создать final
с пониманием списка следующим образом:
last = {k: {i : edges[i] for i in v} for k, v in intermediate.items()}
Пример выполнения:
>>> from pprint import pprint
>>> pprint(final)
defaultdict(<class 'dict'>,
{'category1': {1: [987, 682, 465], 3: [32, 563, 659, 902]},
'category2': {3: [32, 563, 659, 902]},
'category37': {1: [987, 682, 465]},
'category45': {2: [45, 67, 85, 907]},
'category86': {2: [45, 67, 85, 907]}})
>>> pprint(last)
{'category1': {1: [987, 682, 465], 3: [32, 563, 659, 902]},
'category2': {3: [32, 563, 659, 902]},
'category37': {1: [987, 682, 465]},
'category45': {2: [45, 67, 85, 907]},
'category86': {2: [45, 67, 85, 907]}}
Использование промежуточного словаТаблица - это отличный способ гибко выполнять поиск по сложному набору данных / таблице, связывать таблицы и легко создавать новые таблицы.