gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:26 25 4
gpt4 key购买 nike

我有一个目录树,其中包含名为幻灯片的 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/slide-2/slide-1”内的slide-1.html和slide-3.html,将“slides_root”合并为:

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对象列表等等。

规则是,如果相对路径相同,那么我会将幻灯片 1 中的幻灯片对象替换为幻灯片 2 中的幻灯片对象。

怎样才能达到这样的结果呢?这真的很困难,我看不到任何出路。理想情况下是这样的:

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

也许这可以让您了解我将如何处理这个问题。

关于python - 合并两个包含列表的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27323078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com