Python -- 优雅的 dict comp 其中 keys/values 来自同步列表?
Python -- elegant dict comp where keys/values comes from sync'd lists?
我有一个包含两个条目的字典:
"triggers":[1, 4, 5, 9],
"actions":[2, [1, 12, 13, 14], [1, 12, 13, 14], [3, 12, 13]]
触发器对应于动作——所以 1 对应于 2,4 对应于列表 [1,12,13,14],等等。我正在尝试创建一个字典,在其中我将其展平并对应数字到这两个词典:
ALARM_TRIGGER_EVENTS = {1: "SENSOR OPEN",
2: "MOTION DETECTED",
...etc}
ALARM_ACTION_EVENTS = {1: "S-SOUND SIREN",
2: "SOUND BEEP",
...etc}
所以我的最终字典应该将前两个拼平,但用最后两个字典中相应的事件名称替换数字,如下所示:
{"SENSOR OPEN":"SOUND BEEP", etc}
到目前为止,我已经能够用这个来压平前两个:
{trigger:self.alarmInfo["actions"][i] for i, trigger in \
enumerate(self.alarmInfo["triggers"])}
(供参考,self.alarmInfo是第一组列表的字典)
所以,有两个问题:1) 是否有更优雅的方式来完成我刚刚发布的字典理解,以及 2) 是否有一种优雅的方式将数字转换为值,以便我最终得到首选的字典外观我在上面发帖?我一直在想办法,但它们最终变得异常难读且丑陋。谢谢。
>>> d = {
... 'actions': [2, [1, 12, 13, 14], [1, 12, 13, 14], [3, 12, 13]],
... 'triggers': [1, 4, 5, 9],
... }
>>> d_map = dict(zip(d['triggers'], d['actions']))
>>> d_map = {k: [v] if isinstance(v, int) else v for k,v in d_map.items()}
>>> d_map
{1: [2], 4: [1, 12, 13, 14], 5: [1, 12, 13, 14], 9: [3, 12, 13]}
现在可以写理解了:
{TRIGGERS[k]: [ACTIONS(v) for v in vs] for k,vs in d_map.items()}
我有一个包含两个条目的字典:
"triggers":[1, 4, 5, 9],
"actions":[2, [1, 12, 13, 14], [1, 12, 13, 14], [3, 12, 13]]
触发器对应于动作——所以 1 对应于 2,4 对应于列表 [1,12,13,14],等等。我正在尝试创建一个字典,在其中我将其展平并对应数字到这两个词典:
ALARM_TRIGGER_EVENTS = {1: "SENSOR OPEN",
2: "MOTION DETECTED",
...etc}
ALARM_ACTION_EVENTS = {1: "S-SOUND SIREN",
2: "SOUND BEEP",
...etc}
所以我的最终字典应该将前两个拼平,但用最后两个字典中相应的事件名称替换数字,如下所示:
{"SENSOR OPEN":"SOUND BEEP", etc}
到目前为止,我已经能够用这个来压平前两个:
{trigger:self.alarmInfo["actions"][i] for i, trigger in \
enumerate(self.alarmInfo["triggers"])}
(供参考,self.alarmInfo是第一组列表的字典)
所以,有两个问题:1) 是否有更优雅的方式来完成我刚刚发布的字典理解,以及 2) 是否有一种优雅的方式将数字转换为值,以便我最终得到首选的字典外观我在上面发帖?我一直在想办法,但它们最终变得异常难读且丑陋。谢谢。
>>> d = {
... 'actions': [2, [1, 12, 13, 14], [1, 12, 13, 14], [3, 12, 13]],
... 'triggers': [1, 4, 5, 9],
... }
>>> d_map = dict(zip(d['triggers'], d['actions']))
>>> d_map = {k: [v] if isinstance(v, int) else v for k,v in d_map.items()}
>>> d_map
{1: [2], 4: [1, 12, 13, 14], 5: [1, 12, 13, 14], 9: [3, 12, 13]}
现在可以写理解了:
{TRIGGERS[k]: [ACTIONS(v) for v in vs] for k,vs in d_map.items()}