首页 > 解决方案 > 使用单个值和元组的组合将字典映射到另一个字典

问题描述

我有以下内容:

# Op Codes
A_CMD = 17
B_CMD = 18
C_CMD = 19
D_CMD = 20
E_CMD = 21

cmd_dict = {
  A_CMD : "ORANGE",
  B_CMD : ("RED", "GREEN"),
  C_CMD : "BLACK",
  D_CMD : ("PURPLE", "BLUE"),
  E_CMD : "WHITE"
}

color_dict = {
  "RED"    : 1,
  "WHITE"  : 2,
  "BLUE"   : 3,
  "GREEN"  : 4,
  "ORANGE" : 5,
  "BLACK"  : 6,
  "PURPLE" : 7
}

我想要一个将 cmd_dict 映射到 color_dict 的字典,而 cmd_dict 包含元组和单个字符串值的组合。

CmdToColorDict = {
  A_CMD : 5,
  B_CMD : (1, 4),
  C_CMD : 6,
  D_CMD : (7, 3),
  E_CMD : 2
}

我试过了 :cmdToColorDict = {color_dict.get(key, key):value for key, value in cmd_dict.items()}

但它会产生原始的 cmd_dict :{17: 'ORANGE', 18: ('RED', 'GREEN'), 19: 'BLACK', 20: ('PURPLE', 'BLUE'), 21: 'WHITE'}

编辑:(我让它工作!)

cmdToColorDict = {}
for key in cmd_dict:
  if(type(cmd_dict[key]) is tuple):
    L=list(())
    for item in cmd_dict[key]:
      L.append(str(color_dict[item]))
    cmdToColorDict[key] = tuple(L)
  else:
       cmdToColorDict[key] = color_dict[cmd_dict[key]]

产生:{17: 5, 18: ('1', '4'), 19: 6, 20: ('7', '3'), 21: 2}

有没有办法让这段代码更苗条?

标签: pythonpython-3.xdictionarytuplesmapping

解决方案


首先,您cmd_dict[key]在循环中多次访问。您可以迭代cmd_dict.items()(生成 (key, value) 的元组)以避免这种情况:

cmdToColorDict = {}
for key, val in cmd_dict.items():
    if isinstance(val, tuple):
        L = list(())
        for item in val:
            L.append(str(color_dict[item]))
        cmdToColorDict[key] = tuple(L)
    else:
        cmdToColorDict[key] = color_dict[val]

然后可以使用生成器表达式避免嵌套循环:

cmdToColorDict = {}
for key, val in cmd_dict.items():
    if type(cmd_dict[key]) is tuple:
        cmdToColorDict[key] = tuple(str(color_dict[item]) for item in val)
    else:
        cmdToColorDict[key] = color_dict[val]

最后,您可以使用 dict 理解来编码该循环,但它不一定更具可读性。由你决定。

cmdToColorDict = {
    key: tuple(str(color_dict[item]) for item in val)
    if isinstance(val, tuple)
    else color_dict[val]
    for key, val in cmd_dict.items()
}

无论如何,如果您不熟悉列表或字典理解或生成器,尝试将此类循环转换为这些循环是一个很好的练习。


推荐阅读