Python - 优雅的dict comp,其中键/值来自同步列表?

时间:2015-04-04 05:33:10

标签: python for-loop list-comprehension dictionary-comprehension

我有一个包含两个条目的字典:

"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)是否有一种优雅的方法将数字转换为值,所以我最终得到了我发布的首选字典外观以上?我一直在想办法,但他们最终难以阅读和丑陋。感谢。

1 个答案:

答案 0 :(得分:-1)

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