Skip to main content
 首页 » 编程设计

python之将命令解析为树 python : multiple key dictionary

2025年05月04日15bluestorm

我有一个看起来像这样的命令列表:

set_string equipment_type 3 泵

几乎所有命令都遵循这个模板:

cmd_type propertyname equipment_id value

我想做的是遍历一个充满这种命令的txt文档,并存储所有可能的命令语句组合。我只对 cmd、type、equipment_id 的维度和属性名称感兴趣。

我已经做过的是使用一个字典,其中元组 (cmd,type,dimension) 作为键,一组属性名称作为值。

但我想在这个数据结构中添加一个优先级的概念:cmd 然后输入然后维度。 python中是否有树状数据结构可以让我存储这种数据?第一层是:cmd,第二层:type,第三层是:dimension,叶子是一组属性名称,可以在树中的相应路径后使用。

感谢您的帮助!

请您参考如下方法:

您可以使用嵌套的字典、嵌套的默认字典或 Trie .

对于标准的字典,你会使用 setdefault :

tree = {} 
tree.setdefault(cmd, {}).setdefault(cmd_type, {}).setdefault(dimension, []).append(prop) 

它会给你一个列表的字典的字典。 如果你想在叶子上设置,你可以使用:

tree.setdefault(cmd, {}).setdefault(cmd_type, {}).setdefault(dimension, set()).add(prop) 

举个例子:

data = [ 
  ('cmd1', 'typeA', 3, 'propertyX'), 
  ('cmd1', 'typeA', 3, 'propertyZ'), 
  ('cmd1', 'typeB', 2, 'propertyY'), 
  ('cmd2', 'typeA', 3, 'propertyX'), 
  ('cmd2', 'typeB', 1, 'propertyZ'), 
  ('cmd2', 'typeA', 1, 'propertyX'), 
  ('cmd1', 'typeB', 2, 'propertyZ') 
]  
 
tree = {} 
for cmd, cmd_type, dimension, prop in data: 
    tree.setdefault(cmd, {}).setdefault(cmd_type, {}).setdefault(dimension, []).append(prop) 
 
from pprint import pprint 
pprint(tree) 

输出:

{'cmd1': {'typeA': {3: ['propertyX', 'propertyZ']}, 
          'typeB': {2: ['propertyY', 'propertyZ']}}, 
 'cmd2': {'typeA': {1: ['propertyX'], 3: ['propertyX']}, 
          'typeB': {1: ['propertyZ']}}} 

使用 defaultdicts,您的代码将如下所示:

tree = defaultdict(lambda: defaultdict(lambda: defaultdict(list))) 
for cmd, cmd_type, dimension, prop in data: 
    tree[cmd][cmd_type][dimension].append(prop)