1

私は2つのエントリを持つ辞書を持っています:

"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] に対応します。これを平坦化し、数字をこれら 2 つの辞書に対応させる辞書を作成しようとしています。

ALARM_TRIGGER_EVENTS = {1: "SENSOR OPEN",
                        2: "MOTION DETECTED",
                        ...etc}
ALARM_ACTION_EVENTS = {1: "S-SOUND SIREN",
                       2: "SOUND BEEP",
                       ...etc}

したがって、私の究極の辞書は最初の 2 つを平坦化する必要がありますが、数字を最後の 2 つの辞書の対応するイベント名に置き換える必要があります。次のようになります。

{"SENSOR OPEN":"SOUND BEEP", etc}

これまでのところ、これで最初の 2 つを平らにすることができました。

{trigger:self.alarmInfo["actions"][i] for i, trigger in \
    enumerate(self.alarmInfo["triggers"])}

(参考までに、self.alarmInfo はリストの最初のセットの辞書です)

したがって、2 つの質問: 1) 投稿したばかりの辞書理解を達成するためのよりエレガントな方法はありますか? 2) 数値を値に変換するためのエレガントな方法はありますか? 私は方法を考え続けていますが、それらは信じられないほど読みにくく、醜いものになってしまいます。ありがとう。

4

1 に答える 1

0
>>> 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()}
于 2015-04-04T06:16:33.630 に答える