【问题标题】:Return a list of all objects vertically stacked above a given object?返回垂直堆叠在给定对象上方的所有对象的列表?
【发布时间】:2020-02-21 21:27:40
【问题描述】:

对于物理程序的输入,我正在构建相互堆叠的层。对于每一层,可以堆叠多个对象,因此物理结果将如下图所示。

示例脚本显示了我想如何构建这些堆栈,并且我想生成一个元组列表,每个元组包含从底部开始垂直堆叠的对象。

对任何对象调用get_stacks() 将返回其上的堆栈。

多年来,我一直设法避免理解递归,但现在是时候学习了。有没有简单的方法来做到这一点?

class Thing():
    def __init__(self, name):
        self.name = name
        self.things = []
    def add(self, name):
        thing = Thing(name)
        self.things.append(thing)
        return thing
    def __repr__(self):
        return ('{self.name}'.format(self=self))
    def get_stacks(self):    
        "generates a list of tuples of vertically stacked objects"
        stacks = []
        # What do I do here to get a list of tuples of objects?
        return stacks

S = Thing('S')
C = S.add('A').add('B').add('C')
D = S.add('D')
E = D.add('E')
F = D.add('F')

print(S.get_stacks()) # expect [('S', 'A', 'B', 'C'), ('S', 'D', 'E'), ('S', 'D', 'F')]

print(D.get_stacks()) # expect [('D', 'E'), ('D', 'F')]

print(C.get_stacks()) # expect [('C',)]

#  ------------
# |      C     |
#  ------------------------
# |      B     |  E  |  F  |
#  ------------------------
# |      A     |     D     |
#  ------------------------
# |        Substrate       |
#  ------------------------

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    您的谜题与带有已定义子元素的Tree traversal 有关。您应该尝试采用任何可能的方式(在您的情况下为thing)并在没有任何东西的情况下保存结果。在某些情况下,您不会将当前路径保存到堆栈中,而应该进一步递归,将当前路径存储在某处。下面我写了一个快速解决方案,如何在您的特定情况下达到结果。您还可以改进您的代码,将parent 存储在您的类中,或其他方式。有很多方法。

    def get_stacks(self):
        stacks = []
    
        def __fill_stacks(stacks, thing, path):
            for th in thing.things:
                __fill_stacks(stacks, th, path + [thing.name])
            if not thing.things:
                stacks.append(path + [thing.name])
    
        __fill_stacks(stacks, self, [])
    
        return stacks
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多