将一个字典映射到另一个具有单个值和元组组合的字典



我有以下内容:

# 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_dct包含元组和单个字符串值的组合。

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}

有没有办法让这个代码更精简?

首先,在循环中多次访问cmd_dict[key]。你可以在CCD_ 5上迭代(其生成(key,值((来避免:

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()
}

不管怎样,如果你不熟悉列表或dict理解,或者生成器,尝试将这些循环转换为这些

最新更新