字典键和值Python的笛卡尔积

时间:2018-09-05 16:57:29

标签: python dictionary cartesian-product

我有两个包含数据的列表:

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 = abs('C1'-'R3')= abs(10-20)= abs(-10)= 10

因此,我必须使用其他两个词典的所有计算出的组合来更新现有的词典(Dic_Courses_Room_Capacity)。我试图用两个for循环遍历这两个字典,但结果是每个键(=元组)总是得到相同的数字。

有什么想法吗? 最好的祝福, 扬

1 个答案:

答案 0 :(得分:2)

通过两个字典进行简单迭代,将元组和绝对差添加到另一个字典中:

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} 方式:

version: 2
    jobs:
      build:
        docker:
          - image: circleci/node:8.9.1
    steps:
      - checkout
      - restore_cache:
          key: dependency-cache-{{ checksum "package.json" }}
  - save_cache:
      key: dependency-cache-{{ checksum "package.json" }}
      paths:
        - node_modules
  - persist_to_workspace:
      root: /home/circleci
      paths: project
deploy:
    docker:
      - image: cibuilds/aws:1.16.1
steps:
  - checkout
  - attach_workspace:
      at: /home/circleci
  - run:
      name: AWS S3
      command: aws s3 sync build s3://<URL> --delete

workflows:
  version: 2
  build-and-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: master