Python:动态存储字典的访问权限

时间:2014-08-04 03:31:22

标签: python loops python-3.x dictionary reference

我试图找出如何做到这一点(google,SO等),但我可能使用了错误的关键字......

基本上我逐行循环遍历文件,如果我点击一个关键字,我想将它添加到字典作为其键,但是,我想将其值添加为初始字典字典,然后任何后续命中作为一个孩子(等等),除非我点击一个关闭字符,它将在字典中上升一级。

示例文件:

def myitem {
    def aSubItem {
        abc
    }
    def anotherSubItem {
        hi!
        hows you?
    }
}

所以我得到这样的字典:

mydict = {
    "myitem" : {
        "aSubItem" : { "abc" },
        "anotherSubItem" : { "hi!", "hows you?" }
    }
}

基本上,我在某种程度上可以存储当前深度(或dict访问权限),因此,您可以访问' abc'通过做mydict [' myitem'] [' aSubItem'],但是我希望能够存储我有多深,因为有人在那个块中添加了一些东西...所以类似于:

curLevel = ['myitem']['aSubItem']

然后我可以告诉mydict访问curLevel,然后当块完成时(点击}),我可以告诉它上升到一个级别'到

curLevel = ['myitem']

===================

我知道我可以使用

curLevel = mydict

这将让我使用curLevel访问myDic ... 这可以很好地进入字典级别......

然而,我怎么会上升? 即如果我有:

curLevel = mydict['myitem']['aSubItem']

我怎么去

curLevel = mydict['myitem']

====================

以下是一些示例代码,因为每个人都喜欢示例代码:P

这正在下载到字典中,我只是不确定如何让它重新开始

import os
import re

# file location
fle = "myfilelocation"
# read file contents
fh = open(fle, 'r')
content = fh.readlines()

# The dictionary to hold the structure
structure = {}
# reference to structure that we will use in the loop
cur = structure

# loop through file lines
for line in content:

    # Match our starting def line ( def ___ { )
    st = re.match(r'\s*Def\s([^{\s]+)', line, re.IGNORECASE)
    if st:
        cur[st.group(1)] = {}
        cur = cur[st.group(1)]

    # Match the close of a block ( } )
    ed = re.match(r'\s*}\s*', line)
    if ed:
        # ??? How do I tell it to go up one dict level??
        None

    # If its neither, add to current level of array
    # Don't mind the inefficiency here, I'll be improving it later
    if not st and not ed and not re.match(r'\s*{\s*$', line) and not re.match(r'\s*$', line):
        # Not implemented yet
        None

print(structure)

目前上面示例代码的输出类似于

mydict = {
    "myitem" : {
        "aSubItem" : {
            "anotherSubItem" : {}
            }
        }
    }
}

如果需要更多信息,我很乐意提供:)

(是的,我知道我可能会使用解析器......但我完全没有任何运气......此外,从头开始写东西是一个很好的练习xD)

1 个答案:

答案 0 :(得分:1)

正如您所指出的那样,孩子们不会自动提及他们的父母,所以你不能只是“回去”。

您需要明确地为这些引用提供一个特殊键,如__parent或某些不会被实际键复制的内容,或者保留一个单独的列表,作为“堆栈”并跟踪您在树中的当前路径,随时添加新关卡并pop将它们返回到父级。

curLevel = ['myitem']['aSubItem']几乎在那里,但不起作用,只需使用一个列表curLevel = ['myitem', 'aSubItem']append以及pop

根据您的需要,保留对列表中字典的引用,或者将密钥保留在那里,然后使用密钥从基础对象向上走。