Python 返回垂直堆叠在给定对象上方的所有对象的列表?
对于物理程序的输入,我正在构建层叠在一起的层。对于每个层,可以堆叠多个对象,因此物理结果将如下图所示 示例脚本显示了我想如何构建这些堆栈,我想生成一个元组列表,每个元组包含从底部开始垂直堆叠的对象 对任何对象调用get_stacks都将返回该对象上的堆栈 多年来我一直努力避免理解递归,但现在是学习的时候了。有没有一个简单的方法可以做到这一点Python 返回垂直堆叠在给定对象上方的所有对象的列表?,python,python-3.x,Python,Python 3.x,对于物理程序的输入,我正在构建层叠在一起的层。对于每个层,可以堆叠多个对象,因此物理结果将如下图所示 示例脚本显示了我想如何构建这些堆栈,我想生成一个元组列表,每个元组包含从底部开始垂直堆叠的对象 对任何对象调用get_stacks都将返回该对象上的堆栈 多年来我一直努力避免理解递归,但现在是学习的时候了。有没有一个简单的方法可以做到这一点 class Thing(): def __init__(self, name): self.name = name
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
天哪,蝙蝠侠格兰诺拉麦片,真管用!好的,我会很乐意弄清楚这是如何/为什么工作的,从而开始理解递归。感谢您的快速解决方案!仅供参考,我刚问过神圣的格兰诺拉蝙蝠侠,它很管用!好的,我会很乐意弄清楚这是如何/为什么工作的,从而开始理解递归。感谢您的快速解决方案!仅供参考,我刚问过