Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将命令解析为python树:多键字典?_Python_Dictionary_Tree - Fatal编程技术网

将命令解析为python树:多键字典?

将命令解析为python树:多键字典?,python,dictionary,tree,Python,Dictionary,Tree,我有一个如下所示的命令列表: 3型泵组(串设备) 所有命令几乎都遵循此模板: cmd类型属性名称设备id值 我想做的是浏览一个包含此类命令的txt文档,并存储所有可能的命令语句组合。我只对cmd、类型、设备的尺寸和属性名称感兴趣 我已经使用了一个字典,元组(cmd、type、dimension)作为键,一组属性名作为值 但我想在这个数据结构中添加一个优先级的概念:cmd,然后是type,然后是dimension。python中是否有一个树状数据结构允许我存储此类数据?第一层是:cmd,第二层是:

我有一个如下所示的命令列表:

3型泵组(串设备)

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

cmd类型属性名称设备id

我想做的是浏览一个包含此类命令的txt文档,并存储所有可能的命令语句组合。我只对cmd、类型、设备的尺寸和属性名称感兴趣

我已经使用了一个字典,元组(cmd、type、dimension)作为键,一组属性名作为值

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


谢谢你的帮助

您可以使用嵌套的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
,毕竟你模仿了上一级的设置。