繁体   English   中英

从字典递归获取所有嵌套元素

[英]Recursively getting all nested elements from a Dictionary

我是python新手,刚在python中实现了我的第一个ID3,并以类似dict的形式编写了规则

{'a' : {'b': 'no', 'c': 'no', 'd': {'z': {'q': 'no', 'y': 'yes'}}}}

我现在想输出为

<a = b >---> 'no'
<a = c >---> 'no'
<a = d > AND <z = q >---> 'no'
<a = d > AND <z = y >---> 'yes'

我似乎无法做对

这是我的代码:假定将所有内容作为单个字符串返回,并用逗号分隔

def printer(a):
    keys = a.keys()
    for i in keys:
        rules = ""
        for j in a[i].keys():
            tulip = "< Attribute " + str(i) + " = "
            tulip += str(j)
            tulip += " > "
            if type(a[i][j]) == str:
                tulip += "--->" + str(a[i][j]) 
                rules += tulip
                rules += ","
            else:
                tulip += "AND " 
                tulip += str(printer(a[i][j]))
            rules += tulip    

    return rules

更新:

对于使用任意嵌套打印这些规则的递归函数,可以使用以下命令:

更新了目录和功能

rules = {4: {'s': 'No', 'a': 'e', 'p': 'No', 'c': 'No', 'l': 'e', 'f': 'No', 'm': 'No', 'n': {19: {'o': 'e', 'r': 'No', 'b': 'e', 'h': 'e', 'w': {21: {'p': 'e', 'w': 'e', 'd': {1: {'s': 'e', 'f': 'No', 'y': 'No'}}, 'g': 'e', 'l': {2: {'c': 'e', 'w': 'No', 'n': 'e', 'y': 'No'}}}}, 'k': 'e', 'n': 'e', 'y': 'e'}}, 'y': 'No'}}
string_rules = [] # to keep them in a list


def print_nested_count(myDict, parent=None, out=[], count=0):
    for key, value in myDict.items():
        if isinstance(value, dict):
            count += 1  # signifies recursion level
            if parent and count % 2 == 0:
                out.append("<{} = {}> AND ".format(parent, key))
            count = print_nested_count(value, key, out, count=count)
        else:
            if count:
                string_rules.append("".join(out).lstrip() + "<{} = {}> ----> {}".format(parent, key, value))
    if count % 2 == 0 and out:
        out.pop()
    count -= 1
    return count

更新的输出

通过调用此函数并在string_rules打印每一行:

if __name__ == "__main__":
    print_nested_count(rules)
    for line in string_rules: print(line)

输入格式:

{4: {'a': 'e',
     'c': 'No',
     'f': 'No',
     'l': 'e',
     'm': 'No',
     'n': {19: {'b': 'e',
                'h': 'e',
                'k': 'e',
                'n': 'e',
                'o': 'e',
                'r': 'No',
                'w': {21: {'d': {1: {'f': 'No', 's': 'e', 'y': 'No'}},
                           'g': 'e',
                           'l': {2: {'c': 'e', 'n': 'e', 'w': 'No', 'y': 'No'}},
                           'p': 'e',
                           'w': 'e'}},
                'y': 'e'}},
     'p': 'No',
     's': 'No',
     'y': 'No'}}

输出格式:

<4 = s> ----> No
<4 = a> ----> e
<4 = l> ----> e
<4 = y> ----> No
<4 = p> ----> No
<4 = n> AND <19 = y> ----> e
<4 = n> AND <19 = w> AND <21 = p> ----> e
<4 = n> AND <19 = w> AND <21 = w> ----> e
<4 = n> AND <19 = w> AND <21 = d> AND <1 = s> ----> e
<4 = n> AND <19 = w> AND <21 = d> AND <1 = f> ----> No
<4 = n> AND <19 = w> AND <21 = d> AND <1 = y> ----> No
<4 = n> AND <19 = w> AND <21 = l> AND <2 = y> ----> No
<4 = n> AND <19 = w> AND <21 = l> AND <2 = w> ----> No
<4 = n> AND <19 = w> AND <21 = l> AND <2 = c> ----> e
<4 = n> AND <19 = w> AND <21 = l> AND <2 = n> ----> e
<4 = n> AND <19 = w> AND <21 = g> ----> e
<4 = n> AND <19 = h> ----> e
<4 = n> AND <19 = k> ----> e
<4 = n> AND <19 = r> ----> No
<4 = n> AND <19 = n> ----> e
<4 = n> AND <19 = o> ----> e
<4 = n> AND <19 = b> ----> e
<4 = f> ----> No
<4 = c> ----> No
<4 = m> ----> No

更短:

# recursive build up the prefix for the current level
def format(rule, start=True, prefix=""):
    for (key, value) in rule.iteritems():
        if isinstance(value, type({})):
            format(value, not start, ("{0}<{1} = " if start else "{0}{1}> AND ").format(prefix, key))
        else:
            print "{0}{1}> ----> {2}".format(prefix, key, value)

因此,请在您的更大的规则/递归字典上进行测试:

rules2 = {4: {'a': 'e',
     'c': 'No',
     'f': 'No',
     'l': 'e',
     'm': 'No',
     'n': {19: {'b': 'e',
                'h': 'e',
                'k': 'e',
                'n': 'e',
                'o': 'e',
                'r': 'No',
                'w': {21: {'d': {1: {'f': 'No', 's': 'e', 'y': 'No'}},
                           'g': 'e',
                           'l': {2: {'c': 'e', 'n': 'e', 'w': 'No', 'y': 'No'}},
                           'p': 'e',
                           'w': 'e'}},
                'y': 'e'}},
     'p': 'No',
     's': 'No',
     'y': 'No'}}

format(rules2)

产量作为输出:

<4 = a> ----> e
<4 = p> ----> No
<4 = c> ----> No
<4 = f> ----> No
<4 = y> ----> No
<4 = s> ----> No
<4 = m> ----> No
<4 = l> ----> e
<4 = n> AND <19 = b> ----> e
<4 = n> AND <19 = w> AND <21 = p> ----> e
<4 = n> AND <19 = w> AND <21 = w> ----> e
<4 = n> AND <19 = w> AND <21 = d> AND <1 = y> ----> No
<4 = n> AND <19 = w> AND <21 = d> AND <1 = s> ----> e
<4 = n> AND <19 = w> AND <21 = d> AND <1 = f> ----> No
<4 = n> AND <19 = w> AND <21 = g> ----> e
<4 = n> AND <19 = w> AND <21 = l> AND <2 = y> ----> No
<4 = n> AND <19 = w> AND <21 = l> AND <2 = c> ----> e
<4 = n> AND <19 = w> AND <21 = l> AND <2 = w> ----> No
<4 = n> AND <19 = w> AND <21 = l> AND <2 = n> ----> e
<4 = n> AND <19 = y> ----> e
<4 = n> AND <19 = h> ----> e
<4 = n> AND <19 = k> ----> e
<4 = n> AND <19 = r> ----> No
<4 = n> AND <19 = o> ----> e
<4 = n> AND <19 = n> ----> e

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM