Декартово произведение словарных ключей и значений Python - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть два списка с данными:

COURSES = [C1, C2, C3]
ROOMS = [R1, R2, R3]

и я уже создал список кортежей, содержащих их декартово произведение:

L_CR = list(itertools.product(COURSES, ROOMS))
#print(L_CR): [('C1', 'R1'), ('C1', 'R2'), ('C1', 'R3'), ('C2', 'R1').....

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

dic_courses = {'C1': 10, 'C2': 5, 'C3': 20}
dic_rooms = {'R1': 5, 'R2': 10, 'R3': 20}

Что я не могу понять, так это то, как я могу создать словарь, в котором в качестве ключей используются кортежи, и абсолютную разницу между максимальным количеством людей, которое может быть в комнате, и количеством людей, посещающих курс. До сих пор я создавал словарь, в котором каждый кортеж хранится в качестве ключа, и каждому ключу присваивается значение 1:

Dic_Courses_Room_Capacity = {}
for Element in L_CR:    
    Dic_Courses_Room_Capacity_Temp = {Element: 1}
    Dic_Courses_Room_Capacity.update(Dic_Students_Room_Capacity_Temp)

Что приводит к:

#print(Dic_Courses_Room_Capacity): {('C1', 'R1'): 1, ('C1', 'R2'): 1, ('C1', 'R3'): 1...

Но то, что я ищу, будет:

#print(Dic_Courses_Room_Capacity): {('C1', 'R1'): 5 , ('C1', 'R2'): 0, ('C1', 'R3'): 10

где, например: ('C1', 'R3'): 10 = абс ('C1' -'R3 ') = абс (10-20) = абс (-10) = 10

Таким образом, я должен обновить свой существующий словарь (Dic_Courses_Room_Capacity) всеми вычисленными комбинациями двух других словарей. Я попытался перебрать эти два словаря с двумя циклами for, но в результате всегда получал одно и то же число для каждого ключа (= кортеж).

Есть идеи? С наилучшими пожеланиями, Jan

1 Ответ

0 голосов
/ 05 сентября 2018

Простая итерация по двум словарям, добавление кортежа и абсолютной разницы в другой:

dic_courses = {'C1': 10, 'C2': 5, 'C3': 20}
dic_rooms = {'R1': 5, 'R2': 10, 'R3': 20}

d = {}
for k1, v1 in dic_courses.items():
    for k2, v2 in dic_rooms.items():
        d.update({(k1, k2): abs(v1 - v2)})

print(d)

# {('C1', 'R1'): 5, ('C1', 'R2'): 0, ('C1', 'R3'): 10,
#  ('C2', 'R1'): 0, ('C2', 'R2'): 5, ('C2', 'R3'): 15,
#  ('C3', 'R1'): 15, ('C3', 'R2'): 10, ('C3', 'R3'): 0}

или itertools.product способ:

from itertools import product

dic_courses = {'C1': 10, 'C2': 5, 'C3': 20}
dic_rooms = {'R1': 5, 'R2': 10, 'R3': 20}

d = {}
for x, y in product(dic_courses, dic_rooms):
    d.update({(x, y): abs(dic_courses[x] - dic_rooms[y])})

print(d)

# {('C1', 'R1'): 5, ('C1', 'R2'): 0, ('C1', 'R3'): 10, 
#  ('C2', 'R1'): 0, ('C2', 'R2'): 5, ('C2', 'R3'): 15,
#  ('C3', 'R1'): 15, ('C3', 'R2'): 10, ('C3', 'R3'): 0}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...