Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x - Fatal编程技术网

Python 返回垂直堆叠在给定对象上方的所有对象的列表?

Python 返回垂直堆叠在给定对象上方的所有对象的列表?,python,python-3.x,Python,Python 3.x,对于物理程序的输入,我正在构建层叠在一起的层。对于每个层,可以堆叠多个对象,因此物理结果将如下图所示 示例脚本显示了我想如何构建这些堆栈,我想生成一个元组列表,每个元组包含从底部开始垂直堆叠的对象 对任何对象调用get_stacks都将返回该对象上的堆栈 多年来我一直努力避免理解递归,但现在是学习的时候了。有没有一个简单的方法可以做到这一点 class Thing(): def __init__(self, name): self.name = name

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

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

对任何对象调用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       |
#  ------------------------
您的谜题与定义的子元素有关。在你的案例中,你应该尝试去做任何可能的事情,如果没有事情,就保存结果。在某些情况下,您不需要将当前路径保存到堆栈中,而应该进一步递归,将当前路径存储在某个地方。下面我写了一个快速的解决方案,如何在您的特定情况下达到结果。您还可以改进代码、在类中存储父类或其他内容。有很多方法

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
您的谜题与定义的子元素有关。在你的案例中,你应该尝试去做任何可能的事情,如果没有事情,就保存结果。在某些情况下,您不需要将当前路径保存到堆栈中,而应该进一步递归,将当前路径存储在某个地方。下面我写了一个快速的解决方案,如何在您的特定情况下达到结果。您还可以改进代码、在类中存储父类或其他内容。有很多方法

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

天哪,蝙蝠侠格兰诺拉麦片,真管用!好的,我会很乐意弄清楚这是如何/为什么工作的,从而开始理解递归。感谢您的快速解决方案!仅供参考,我刚问过神圣的格兰诺拉蝙蝠侠,它很管用!好的,我会很乐意弄清楚这是如何/为什么工作的,从而开始理解递归。感谢您的快速解决方案!仅供参考,我刚问过