繁体   English   中英

合并包含列表的两个对象列表

[英]Merge two lists of objects containing lists

我有一个目录树,其中包含称为幻灯片的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

...等等。 他们可能会更深入。 现在想象一下,我必须通过将其与另一棵树合并来替换此结构中的一些幻灯片。

举个例子:假设我想将“ slides_root”合并为“ slides_root / slide-2 / slide-1”中的slide-1.html和slide-3.html:

slide_to_change
|
|_slide-2
  |
  |_slide-1
   |_slide-1.html
   |_slide-3.html

我将“ slide_to_change”合并为“ slides_root”。 结构相同,因此一切正常。 但是我必须在该方案的python对象表示中进行操作。

因此,这两个树由具有相同“ Slide”类的两个实例(slides1,slides2)表示,其结构如下:

Slide(object):

def __init__(self, path):
    self.path = path
    self.slides = [Slide(path)]

slide1和slide2都包含一个路径和一个列表,其中包含其他带有其他路径的Slide对象以及其他路径和Slide对象的列表,依此类推。

规则是,如果相对路径相同,那么我将用slide2中的对象替换slide1中的对象。

如何获得这个结果? 这真的很困难,我看不到任何出路。 理想情况是:

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

谢谢大家的回答。

听起来没那么复杂。

只需使用递归函数即可在要插入的树上行走,并保持对那棵老树的对应位置。

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!)

也许这使您对如何处理此问题有了一个想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM