动态地进一步进入嵌套列表

时间:2017-03-11 01:43:46

标签: python

嗨所以我有一个像嵌套列表一样的树,它正在动态扩展。目前我一直在使用eval()和exec()来遍历。有一个更好的方法吗?我觉得我不应该像现在这样做。

我的代码:

tree = ["Outer", ["Inner", ["MoreIn", ["InAgain", [] ] ] ] ]
depth = "tree[-1][-1]"

def addToTree(code):
    if eval(depth) != []:
        exec(depth+"[-1]")
    exec(depth+"="code)

它有效,但这感觉真的很笨拙。有没有办法做到这个更清洁?

输入:

code = ["AnotherOne", [ ]]

输出:

tree = ["Outer", ["Inner", ["MoreIn", ["InAgain", ["AnotherOne", []] ] ] ] ]
depth = "tree[-1][-1][-1][-1][-1][-1]" #or whatever is the next empty []

3 个答案:

答案 0 :(得分:1)

我假设你一般都在询问如何使用大量复杂的内部循环数组。我要做的是使用递归函数。这只是打印出数组中的所有元素,但稍加适应,你可以用它做很多事情。

arr = [[3,2],2,[[5,9],3,4]]

def recursiveLookThrough(arr):
    for element in arr:
        if (isinstance(element,list)):
            recursiveLookThrough(element)
        else:
            print(element)

recursiveLookThrough(arr)

答案 1 :(得分:1)

如果您使用的是exec,那么您几乎肯定会做错了。

递归可能是你想做的最好的方式:

def add(tree, string):
    head, body = tree
    if body:
        add(body, string)
    else:
        body[0:2] = string, []

add(tree, "Wow")
print(tree)

答案 2 :(得分:0)

这是一种避免再次发生的方法:

import itertools

def nest(flat):
    out = []
    for l in reversed(flat):
        out = [l, out]
    return out

def nest_another(nested, next_):
    last = nested
    for depth in itertools.count(0):
        if last[-1] == []:
            break
        last = last[-1]
    last[-1] = [next_, []]
    return depth, last[-1], nested

items = ["item{}".format(i) for i in range(4)]
nested = nest(items)
print(nested)
depth, last, nested = nest_another(nested, 'another')
print(depth, last, nested)
last[-1] = ['yet_another', []]
print(nested)

打印:

# ['item0', ['item1', ['item2', ['item3', []]]]]
# 3 ['another', []] ['item0', ['item1', ['item2', ['item3', ['another', []]]]]]
# ['item0', ['item1', ['item2', ['item3', ['another', ['yet_another', []]]]]]]