python - 使用单个值和元组的组合将字典映射到另一个字典
问题描述
我有以下内容:
# 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}
有没有办法让这段代码更苗条?
解决方案
首先,您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()
}
无论如何,如果您不熟悉列表或字典理解或生成器,尝试将此类循环转换为这些循环是一个很好的练习。
推荐阅读
- apache-nifi - NiFi:使用 ExecuteScript 查询记录
- python - 是否有类似于 unittest 的 assertIsNone(x) 中的 pytest 方法
- javascript - 如何将创建的组精灵分成单独的精灵
- ios - 如何将具有横向边界的子视图添加到具有纵向方向的视图
- node.js - 如何修复 Windows 10 上的“expo-cli”问题?
- swift - Xcode 中循环变量的文档注释
- apache-kafka - 了解 Kafka Stream 中的 max.task.idle.ms 以进行 KStream-KTable 连接
- scala - 将字符串细化为仅某些值
- c# - 使 IIS 应用程序停止/暂停主机重新启动 x 秒
- ionic-framework - 为什么我的应用程序无法使用 paypal 集成发布