将命令解析为python树:多键字典?
我有一个如下所示的命令列表: 3型泵组(串设备) 所有命令几乎都遵循此模板: cmd类型属性名称设备id值 我想做的是浏览一个包含此类命令的txt文档,并存储所有可能的命令语句组合。我只对cmd、类型、设备的尺寸和属性名称感兴趣 我已经使用了一个字典,元组(cmd、type、dimension)作为键,一组属性名作为值 但我想在这个数据结构中添加一个优先级的概念:cmd,然后是type,然后是dimension。python中是否有一个树状数据结构允许我存储此类数据?第一层是:cmd,第二层是:type,第三层是:dimension,叶子是可以在树中相应路径后面使用的属性名称集将命令解析为python树:多键字典?,python,dictionary,tree,Python,Dictionary,Tree,我有一个如下所示的命令列表: 3型泵组(串设备) 所有命令几乎都遵循此模板: cmd类型属性名称设备id值 我想做的是浏览一个包含此类命令的txt文档,并存储所有可能的命令语句组合。我只对cmd、类型、设备的尺寸和属性名称感兴趣 我已经使用了一个字典,元组(cmd、type、dimension)作为键,一组属性名作为值 但我想在这个数据结构中添加一个优先级的概念:cmd,然后是type,然后是dimension。python中是否有一个树状数据结构允许我存储此类数据?第一层是:cmd,第二层是:
谢谢你的帮助 您可以使用嵌套的dict、嵌套的defaultdict或 对于标准DICT,您可以使用: 它会给你一个清单的清单。 如果要在叶上设置,可以使用:
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)
您可以使用嵌套的dict、嵌套的defaultdict或 对于标准DICT,您可以使用: 它会给你一个清单的清单。 如果要在叶上设置,可以使用:
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)
一种相对干净的方法是内嵌的
defaultdict
树:
from collections import defaultdict
def tree():
return defaultdict(tree)
t = tree()
for cmd, type, dim, prop in (l.split() for l in open('file.txt')):
t[cmd][type][dim][prop] = True
这将允许您通过以下方式迭代一个(cmd,type,dim)
三连体的所有道具:
for prop in t[cmd][type][dim]:
# ...
一种相对干净的方法是内嵌的
defaultdict
树:
from collections import defaultdict
def tree():
return defaultdict(tree)
t = tree()
for cmd, type, dim, prop in (l.split() for l in open('file.txt')):
t[cmd][type][dim][prop] = True
这将允许您通过以下方式迭代一个(cmd,type,dim)
三连体的所有道具:
for prop in t[cmd][type][dim]:
# ...
您可以将另一本词典存储为值。谢谢您的提问,我的声誉刚刚超过
0b100000000000000
:)我仍然不确定积分系统是如何工作的。。。我所知道的是,如果我的问题被否决,我会被阻止提问一段时间。^^^。你可以将另一本字典存储为一个值。谢谢你的提问,我的声誉刚刚好起来。0b1000000000000000
:)我仍然不确定积分系统是如何工作的。。。我所知道的是,如果我的问题被否决,我会被阻止提问一段时间。这应该行得通。但我需要在结尾有一组,因为相同的组合可能会重复。在上一个setdefault中,我可以使用set()而不是[]?这应该可以。但我需要在结尾有一组,因为相同的组合可能会重复。在上一个setdefault中,我可以使用set()而不是[]?这是一个有趣的结构!您可以将深度参数添加到树中,以获得另一种类型(例如,树叶上的set
或list
)@EricDuminil是的,它确实是可扩展的,但我不想为了使主要原则尽可能清晰可见而将其弄乱(不传递参数等)。你的答案已经涵盖了OP,但我觉得这应该被提及:)最后的bool
,毕竟你模仿了上一级的场景。这是一个有趣的结构!您可以将深度参数添加到树中,以获得另一种类型(例如,树叶上的set
或list
)@EricDuminil是的,它确实是可扩展的,但我不想为了使主要原则尽可能清晰可见而将其弄乱(不传递参数等)。你的答案已经涵盖了OP,但我觉得这应该被提及:)最后的bool
,毕竟你模仿了上一级的设置。