我有一个目录树,其中包含名为slide的html文件。类似的东西:
slides_root
|
|_slide-1
| |_slide-1.html
| |_slide-2.html
|
|_slide-2
| |
| |_slide-1
| | |_slide-1.html
| | |_slide-2.html
| | |_slide-3.html
| |
| |_slide-2
| |_slide-1.html
......等等。他们可能会更深入。现在想象一下,我必须通过将它与另一棵树合并来替换这个结构中的一些幻灯片。
以示例:说我想替换slide-1.html和slide-3.html里面" slides_root / slide-2 / slide-1"合并" slides_root"用:
slide_to_change
|
|_slide-2
|
|_slide-1
|_slide-1.html
|_slide-3.html
我会合并" slide_to_change"进入" slides_root"。结构是一样的,所以一切都很好。但是我必须在这个方案的python对象表示中做到这一点。
所以这两棵树由两个实例代表 - slide1,slide2 - 同一" Slide"课程结构如下:
Slide(object):
def __init__(self, path):
self.path = path
self.slides = [Slide(path)]
slide1和slide2都包含一个路径和一个列表,其中包含其他Slide对象以及其他路径和Slide对象列表,依此类推。
规则是如果相对路径相同,那么我将slide1中的幻灯片对象替换为slide2中的幻灯片对象。
如何实现这一结果?这真的很难,我看不出任何出路。理想情况如下:
for slide_root in slide1.slides:
for slide_dest in slide2.slides:
if slide_root.path == slide_dest.path:
slide_root = slide_dest
// now restart the loop at a deeper level
// repeat
感谢大家的回答。
答案 0 :(得分:1)
听起来不那么复杂。
只需使用递归函数来遍历要插入的树,并保持对旧树中相应位置的保持。
If the parts match:
If the parts are both leafs (html thingies):
Insert (overwrite) the value.
If the parts are both nodes (slides):
Call yourself with the subslides (here's the recursion).
我知道这只是一种暗示,只是一种关于如何做的草图。但也许你想从这开始。在Python中它可能看起来像这样(也没有完全充实):
def merge_slide(slide, old_slide):
for sub_slide in slide.slides:
sub_slide_position_in_old_slide = find_sub_slide_position_by_path(sub_slide.path)
if sub_slide_position_in_old_slide >= 0: # we found a match!
sub_slide_in_old_slide = old_slide.slides[sub_slide_position_in_old_slide]
if sub_slide.slides: # this is a node!
merge_slide(sub_slide, sub_slide_in_old_slide) # here we recurse
else: # this is a leaf! so we replace it:
old_slide[sub_slide_position_in_old_slide] = sub_slide
else: # nothing like this in old_slide
pass # ignore (you might want to consider this case!)
也许这可以让你了解我将如何处理这个问题。